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

时间:2017-12-09 10:25:24

标签: python class init

我是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 方法的代码,为什么会这样?

2 个答案:

答案 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类似的概念,并且不一定需要它。