__init__ Python语法

时间:2015-02-02 02:56:28

标签: python class

我为食品创建了一个类。我想知道为什么在def __init__(self, type)中有两个参数但是当我调用Food('Meat')时我只传递一个参数。我认为这是因为__init__在某种程度上是特殊的?

class Food(object):

    def __init__(self, type):
        self.type = type

    def cook_food_item(self):
        if self.type == 'Meat':
            print 'Grill it!'
        elif self.type == 'Vegetable':
            print 'Boil it!'
        elif self.type == 'Dairy':
            print 'Churn it!'

hot_dog = Food('Meat')
hot_dog.cook_food_item()

3 个答案:

答案 0 :(得分:2)

__init__确实很特别,因为它是magic method,但并不是因为它接收self作为第一个参数。作为一种类方法就是这样。每个方法都接收self作为第一个参数,它由Python自动传递。我强烈建议您阅读Python基础知识,例如classes,在这种情况下。

答案 1 :(得分:0)

类中的所有方法都将类实例作为第一个参数传递,包括__init__。对于您班级中的其他方法也是如此:def cook_food_item(self)

如果你有另一种方法接受了实际的争论,你可以在self之后加上那个参数,留下类似的东西:

class Food(object):
    ...

    def eat_with(self, drink):
        print("Eating a " + self.type + " while drinking a " + drink)

>>> hot_dog = Food("hot dog")
>>> hot_dog.eat_with("coke")
Eating a hot dog while drinking a coke

在幕后,这是做类似

的事情
>>> hot_dog.eat_with("coke")
# becomes something resembling
hot_dog.__class__.eat_with(hot_dog, "coke") # hot_dog.__class__ is Food

答案 2 :(得分:0)

这里__init__没什么特别的。

在Python中,您有两种方法:绑定和非绑定。类中定义的方法通常是绑定的,这使您可以编写myobj.mymethod()而不是MyClass.mymethod(myobj)。未绑定的方法没有self参数,就像常规函数一样。

为了说明这一点,您可以创建一个这样的未绑定方法:

def myfunction(x):
    return x

class MyClass(object):
    def __init__(self):
        self.unbound = myfunction

    def bound(self, x):
        print('MyClass.bound called with', self)
        return x

myobj = MyClass()
print(myobj.unbound(42))
print(myobj.bound(42))

请注意myfunction(因此myobj.unbound)无权访问self,除非您明确传入。所以一般情况下,MyClass.bound等绑定方法是工具写作课时的选择。 __init__也不例外。作为一种未绑定的方法,它不会非常有用。