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

Creating an instance of a class without defining the __init__ function

我是 python 的新手,我想知道您是否可以在不显式定义 init 的情况下创建 class 的实例。我可以叫它别的名字吗?

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

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

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

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

Bob = dog('Bob')

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

TypeError: object() takes no parameters

因此,基于此我假设必须显式 调用init 方法。但是我看到代码中没有使用 init 方法,这是怎么回事?

每个 class 都有一个 __init__ 方法。如果它没有明确定义一个,那么它将从它的 parent class 继承一个。在你的第二个例子中,class 从基础 object class 继承了 __init__ 和一堆其他方法(和其他 non-method 属性)。我们可以通过 dir 函数看到:

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

print(dir(Dog))

输出

['__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']

__init__ 会在实例构造完成后自动调用(通过 __new__ 方法),所以如果我们需要初始化我们的实例,不妨使用它。但是我们可以明确地调用你的init_instance

bob = Dog()
bob.init_instance('Bob')
print(bob.name)    

输出

My name is Bob
Bob

如果你给你 class 一个没有命名为 __init__ 的初始化程序,那么它 不会 被自动调用。 Python 怎么知道那个方法是初始化器?虽然习惯上让 __init__ 成为 class 定义中的第一个方法,但这绝不是强制性的,有些人喜欢把 __init__ 最后 .

你说:"I have seen code where the init method has not been used, how come?" 好吧,有些 classes 根本不需要初始化它们的实例:它们的实例属性是通过各种其他方法设置的,或者通过在外部代码中直接赋值class 定义,例如 bob.color = 'brown'。或者他们从 parent class 继承了一个完全可用的 __init__

init 只不过是一种初始准备对象状态的方法。在其他语言中,它们具有与 Constructors 类似的概念,但不一定需要。