可以在类中的任何位置分配属性吗?

时间:2013-08-23 23:38:07

标签: python class attributes

可以在类中的任何位置分配属性吗?如果是这样,范围规则如何适用于以下每种情况?

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'

3 个答案:

答案 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警告。但是,不要这样做。