new 负责对象的创建而 init 负责对象的初始化
- 隐含的超类——object
@singleton
class MyClass:
def say_hi(self):
print('hello')
class YourClass:
def __init__(self, name, symbol):
self.name = name
self.symbol = symbol
print(YourClass.__class__)
print(YourClass.__class__.__base__)
print(MyClass.__class__)
======控制台输出======
<class 'function'>
<class 'type'>
<class 'object'>
当我们定义一个类时,object为超类,object继承的默认行为
- 对象的初始化init()
所有类的超类object,有一个默认包含pass的init()实现,我们不需要去实现init()。如果不实现它,则在对象创建后就不会创建实例变量。在某些情况下,这种默认行为是可以接受的。
class YourClass:
def __init__(self, name, symbol):
self.name = name
self.symbol = symbol
def say_hi(self):
print('hello')
print(self.id)
print(self.name)
return self.id
your = YourClass(1,2)
your.id = '11'
your.say_hi()
your.name = 'ddd'
======控制台输出======
hello
11
1
需要 id 但不初始化,可改,而 name 则不可改
注意
- init并不相当于C#中的构造函数,执行它的时候,实例已构造出来
your = YourClass(1,2)
等价于
a=object.__new__(YourClass)
YourClass.__init__(your ,1,2)
- 子类可以不重写init,实例化子类时,会自动调用超类中已定义的init
class B(A):
def getName(self):
return 'B '+self.name
if __name__=='__main__':
b=B('hello')
print b.getName()
#但如果重写了__init__,实例化子类时,则不会隐式的再去调用超类中已定义的__init__
class C(A):
def __init__(self):
pass
def getName(self):
return 'C '+self.name
if __name__=='__main__':
c=C()
print c.getName()
class A(object):
def __new__(cls):
print("A.__new__ called")
return super(A, cls).__new__(cls)
def __init__(self):
print("A.__init__ called")
A()
======控制台输出======
A.__new__ called
A.__init__ called
class Foo(object):
def __call__(self):
pass
f = Foo()#类Foo可call
f()#对象f可call
对象通过提供call(slef, [,args [,*kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.call(self, arg1, arg2) 。模拟函数的对象可以用于创建防函数(functor) 或代理(proxy).
网友评论