__init__
方法为初始化方法, __new__
方法才是真正的构造函数。
1、__new__
方法默认返回实例对象供__init__
方法、实例方法使用。
class Human2(object):
def __init__(self,age,sex):
self.age = age
self.sex = sex
print("self", self)
def speak(self):
print("I am:",self.age,self.sex)
示例:
h = Human2(1,1)
print(dir(h))
运行结果:
self <__main__.Human2 object at 0x00000243980A99E8>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'sex', 'speak']
如果,我们重写 new 函数:
class Human2(object):
# def __new__(cls, *args, **kwds):
# inst = object.__new__(cls)
# print("new, inst", inst)
# return inst
def __init__(self,age,sex):
self.age = age
self.sex = sex
print("self", self)
def speak(self):
print("I am:",self.age,self.sex)
运行结果:
new, inst <__main__.Human2 object at 0x000001D1132C9A58>
self <__main__.Human2 object at 0x000001D1132C9A58>
也就是, new 创建示例,并返回给初始化的第一个参数,这里是 self.
此外, new 还可以返回其他类的实例:
class Human(object):
def __str__(self):
return "Human class"
class Human2(object):
def __new__(cls):
h = Human()
print("call human:",h)
return Human()
def __init__(self):
print("self", self)
参考: