下面的代码将 Duck 类定义为 Bill 类和 Tail 类的组合。我的问题是,对于Duck 类定义中的about() 方法,为什么可以写bill.description
和tail。长度
?这里省略了self
吗?如果是,我什么时候可以省略 self
?我可以在 __init__
方法中省略它们吗?
class Bill():
def __init__(self, description):
self.description = description
class Tail():
def __init__(self, length):
self.length = length
class Duck():
def __init__(self, bill, tail):
self.bill = bill
self.tail = tail
def about(self):
print('This duck has a', bill.description, 'bill and a', tail.length, 'tail')
tail = Tail('long')
bill = Bill('wide orange')
duck = Duck(bill, tail)
duck.about()
最佳答案
长话短说:只要您想访问当前实例的属性(数据属性、特性或方法),您必须使用self.
。
更详细的答案:在 class
语句中使用 def
时,您创建的不是“方法”,而是普通函数。当查找类或实例属性(Duck.about
或 duck.about
)时,此函数将被包装(与查找它的类和实例一起)在一个可调用的 method
对象,它将自动将实例(或类)对象作为函数调用的第一个参数注入(inject)。您可以在此处阅读全部详细信息:https://wiki.python.org/moin/FromFunctionToMethod
正如其他人已经提到的,您的代码片段只是意外地“起作用”,因为它最终会查找恰好已定义的全局名称,并在这些名称未定义时立即中断:
# tail = Tail('long')
# bill = Bill('wide orange')
duck = Duck(Bill('wide orange'), Tail('long'))
duck.about()
=> 崩溃并出现 NameError
如果重新绑定(bind)这些全局名称,您还会得到意想不到的结果,即:
tail = Tail('long')
bill = Bill('wide orange')
duck1 = Duck(bill, tail)
tail = Tail('short')
bill = Bill('norvegian blue')
duck2 = Duck(bill, tail)
duck1.about()
=> 呃,为什么它会打印“short norvegian blue”???
关于python - 在python中,什么时候可以省略self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37963018/