我只是想简化我的一个类,并引入了一些与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的新手,需要一些建议来实现下面的场景.
我在两个不同的注册商处有两个用于管理域名的课程.两者都具有相同的界面,例如
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世界很陌生,并试图学习它.
这就是我想要实现的:我想创建一个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) 这里我定义了不可变类 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 用于创建类实例。新方法还有哪些其他用途?