init()/new()/call()

2019-08-15  本文已影响0人  蕴重Liu

new 负责对象的创建而 init 负责对象的初始化

@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继承的默认行为

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 则不可改

注意

your = YourClass(1,2)
等价于
a=object.__new__(YourClass)
YourClass.__init__(your ,1,2)
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).

上一篇 下一篇

猜你喜欢

热点阅读