gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:15:52 27 4
gpt4 key购买 nike

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

第一个示例 - 使用 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 方法的代码,这是怎么回事?

最佳答案

每个类都有一个 __init__ 方法。如果它没有显式定义一个,那么它将从其父类继承一个。在您的第二个示例中,该类从 object 基类继承了 __init__ 和一堆其他方法(以及其他非方法属性)。我们可以通过 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

如果您给类一个未命名为 __init__ 的初始化程序,那么它不会被自动调用。 Python 应该如何知道该方法是初始化程序?尽管习惯上将 __init__ 作为类定义中的第一个方法,但这绝不是强制性的,有些人喜欢将 __init__ 放在最后

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

关于python - 在不定义 __init__ 函数的情况下创建类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com