美文网首页
init()/new()/call()

init()/new()/call()

作者: 蕴重Liu | 来源:发表于2019-08-15 16:44 被阅读0次

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).

相关文章

  • 简述 __init__、__new__、__call__ 方法

    简述 init、new、call 方法 简述 init、new、call 方法https://foofish.ne...

  • init()/new()/call()

    new 负责对象的创建而 init 负责对象的初始化 隐含的超类——object 当我们定义一个类时,object...

  • Python 元类详解 __new__、__init__、__c

    了解元类之前,先了解几个魔术方法: __new__、__init__、__call__ __new__: 对象的创...

  • [Python] __new__,__init__,__call

    注:__new__在创建对象时调用,返回当前对象的一个实例。第一个参数是cls即class本身。__init__在...

  • __init__、__new__、__call__

    背景:在学习单例的几种实现方式的时候,用到__new__ 、__call__ 。本文对这几个内置函数进行学习分析。...

  • Python 元类

    前提 new、init、call的介绍 在讲到使用元类创建单例模式之前,比需了解new这个内置方法的作用,在上面讲...

  • python之理解__new__、__init__和__call

    python之理解__new__、__init__和__call__ 1、从type看其解释 所有的对象都可以看作...

  • Python元类编程 之 new、init、call

    首先我们知道,实例衍生自类对象,类对象衍生自元类对象 这是一个普通的类对象,其中 __ new __() 代表 类...

  • Python的new与init

    Python的new与init 区别 new方法是在init方法前被调用的。new负责创建,init负责创建后的赋...

  • Python的new与init

    Python的new与init 区别 new方法是在init方法前被调用的。new负责创建,init负责创建后的赋...

网友评论

      本文标题:init()/new()/call()

      本文链接:https://www.haomeiwen.com/subject/ykvzjctx.html