我为食品创建了一个类。我想知道为什么在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()
答案 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__
也不例外。作为一种未绑定的方法,它不会非常有用。