我是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()不带参数
基于此,我假设必须明确调用 init 方法。但是我看到过没有使用 init 方法的代码,为什么会这样?
答案 0 :(得分:5)
每个班级都有一个__init__
方法。如果它没有明确定义一个,那么它将从其父类继承一个。在第二个示例中,该类从基类__init__
类继承object
和一堆其他方法(以及其他非方法属性)。我们可以通过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__
放在最后
你说:&#34;我看过没有使用过init方法的代码,为什么会这样?&#34;好吧,有些类根本不需要初始化它们的实例:它们的实例属性是通过各种其他方法设置的,或者通过在类定义之外的代码中直接赋值,例如bob.color = 'brown'
。或者他们从父类继承了一个完全可用的__init__
。
答案 1 :(得分:1)
init
是一种初始准备对象状态的方法。在其他语言中,它们具有与Constructors
类似的概念,并且不一定需要它。