相关疑难解决方法(0)

为什么在__new __()后总是调用__init __()?

我只是想简化我的一个类,并引入了一些与flyweight设计模式相同的功能.

但是,我有点困惑,为什么__init__总是被称为__new__.我没想到这个.任何人都可以告诉我为什么会这样,以及我如何能够实现这个功能呢?(除了将实施放入__new__感觉相当hacky之外.)

这是一个例子:

class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
            print "EXISTS"
            return A._dict['key']
        else:
            print "NEW"
            return super(A, cls).__new__(cls)

    def __init__(self):
        print "INIT"
        A._dict['key'] = self
        print ""

a1 = A()
a2 = A()
a3 = A()
Run Code Online (Sandbox Code Playgroud)

输出:

NEW
INIT

EXISTS
INIT

EXISTS
INIT
Run Code Online (Sandbox Code Playgroud)

为什么?

python design-patterns class-design

525
推荐指数
14
解决办法
26万
查看次数

Python中的类工厂

我是Python的新手,需要一些建议来实现下面的场景.

我在两个不同的注册商处有两个用于管理域名的课程.两者都具有相同的界面,例如

class RegistrarA(Object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...
Run Code Online (Sandbox Code Playgroud)

和

class RegistrarB(object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...
Run Code Online (Sandbox Code Playgroud)

我想创建一个Domain类,给定一个域名,根据扩展名加载正确的注册器类,例如

com = Domain('test.com') #load RegistrarA
com.lookup()

biz = Domain('test.biz') #load RegistrarB
biz.lookup()
Run Code Online (Sandbox Code Playgroud)

我知道这可以使用工厂函数来完成(见下文),但这是最好的方法吗?还是有更好的方法使用OOP功能?

def factory(domain):
  if ...:
    return RegistrarA(domain)
  else:
    return RegistrarB(domain)
Run Code Online (Sandbox Code Playgroud)

python factory

64
推荐指数
4
解决办法
7万
查看次数

Python对象创建

我对Python世界很陌生,并试图学习它.

这就是我想要实现的:我想创建一个Car类,它的构造函数检查输入以将对象carName设置为输入.我试着通过使用java逻辑来做到这一点但我似乎失败了:)

class Car():
    carName = "" #how can I define a non assigned variable anyway like "String carName;" in java
    def __self__(self,input):
        self.carName = input

    def showName():
        print carName

a = Car("bmw")
a.showName()
Run Code Online (Sandbox Code Playgroud)

python class object

6
推荐指数
1
解决办法
2万
查看次数

python 中 __new__ 方法的其他用途是什么?

这里我定义了不可变类 str。在 新方法中,我将“hello”等实例的值更改为大写。当我们可以在init中定义 upper 时,为什么要使用new来实现呢?

class Upperstr(str):
    def __new__(cls,value=""):
        print(cls)
        print(value)
        return str.__new__(cls,value.upper())

    # def __init__(self,m1):
    #     self.m1 = m1.upper()
    
u = Upperstr("hello")
print(u)

Run Code Online (Sandbox Code Playgroud)

New 用于创建类实例。新方法还有哪些其他用途?

python oop new-operator magic-methods

6
推荐指数
2
解决办法
4921
查看次数