可以在类中的任何位置分配属性吗?如果是这样,范围规则如何适用于以下每种情况?
class GreatComposers(object):
def __init__(self, name, birthday, instrument):
# attributes assigned in __init__
self.name = name
self.birthday = birthday
self.instrument = instrument
def setFullName(self)
# attributes assigned in other class methods
self.fullname = self.name + self.birthday
self.job = self.instrument + 'ist'
# attributes assigned outside any functions
self.nationality = 'german'
答案 0 :(得分:2)
不,它不适用于类范围(在您的示例中为self.nationality = 'german'
),因为此时范围内没有名称self
。并且它在其他情况下不起作用,因为方法或self
参数在某种程度上是特殊的。可以在您拥有对象的引用的任何位置为分配属性。这包括方法,但也包括有权访问相关对象的所有其他代码。
答案 1 :(得分:1)
试一试,看看:
<强> composers.py 强>
class GreatComposers(object):
def __init__(self, name, birthday, instrument):
# attributes assigned in __init__
self.name = name
self.birthday = birthday
self.instrument = instrument
def setFullName(self): # <<< added missing colon
# attributes assigned in other class methods
self.fullname = self.name + self.birthday
self.job = self.instrument + 'ist'
# attributes assigned outside any functions
self.nationality = 'german'
>>> import composers
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "composers.py", line 1, in <module>
class GreatComposers(object):
File "composers.py", line 17, in GreatComposers
self.nationality = 'german'
NameError: name 'self' is not defined
回溯告诉您,在方法之外,您无法向self.nationality
分配任何内容,因为self
不存在(请记住self
只是一个与任何其他参数一样的参数;它与javascript中的this
不同。
在方法中,您可以执行自己喜欢的操作,PEP 8 不警告不要在__init__()
之外定义实例变量,但您的代码会更容易理解如果你不这样做。
答案 2 :(得分:0)
在 init 之外分配自我属性会违反PEP 8,但您仍然可以执行此操作。自我国家不应该起作用,因为自我没有被定义。即使你找到了解决方法,我也不建议这样做。
编辑:我的错误。我用pep 8风格混淆了一个pylint警告。但是,不要这样做。