在不定义__init__函数的情况下创建类的实例

Joh*_*ohn 4 python class init

我相对来说是python的新手,我想知道你是否可以在不定义init明确的情况下创建一个类的实例.我可以称之为其他吗?

第一个例子 - 使用init方法:

class dog:
def __init__(self,name):
    self.name=name
    print('My name is',name)
Bob = dog('Bob')
Run Code Online (Sandbox Code Playgroud)

第二个例子 - 没有init方法:

class dog:
def init_instance(self,name):
    self.name = name
    print('My name is',name)

Bob = dog('Bob')
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,代码有效,但在第二个例子中,我得到:

TypeError:object()不带参数

所以基于此我假设必须显式调用init方法.但是我看过没有使用过init方法的代码,为什么会这样?

PM *_*ing 6

每个班级都有一个__init__方法.如果它没有明确定义一个,那么它将从其父类继承一个.在第二个示例中,该类继承__init__了基object类中的一堆其他方法(以及其他非方法属性).我们可以通过dir函数看到:

class Dog:
    def init_instance(self,name):
        self.name = name
        print('My name is',name)

print(dir(Dog))
Run Code Online (Sandbox Code Playgroud)

产量

['__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__', 'init_instance']
Run Code Online (Sandbox Code Playgroud)

__init__在构造实例之后(通过__new__方法)自动调用,所以如果我们需要初始化我们的实例,我们也可以使用它.但我们可以init_instance明确地打电话给你:

bob = Dog()
bob.init_instance('Bob')
print(bob.name)    
Run Code Online (Sandbox Code Playgroud)

产量

My name is Bob
Bob
Run Code Online (Sandbox Code Playgroud)

如果你给你的类,未命名的初始化__init__,然后它会不会得到自动调用.Python应该如何知道该方法是初始化器?虽然习惯上__init__在类定义中创建第一个方法,但这绝不是强制性的,有些人喜欢放在__init__ 最后.

你说:"我看过没有使用过init方法的代码,为什么会这样?" 好吧,有些类根本不需要初始化它们的实例:它们的实例属性是通过各种其他方法设置的,或者通过在类定义之外的代码中直接赋值,例如bob.color = 'brown'.或者它们__init__从父类继承完全可用.