在不定义 __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
类似的概念,但不一定需要。
我是 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
类似的概念,但不一定需要。