0

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

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'
4

3 回答 3

2

不,它在类范围内不起作用(self.nationality = 'german'在您的示例中),因为此时范围内没有名称self。它在其他情况下不起作用,因为方法或self参数在某种程度上是特殊的。可以在您引用对象的任何地方分配属性。这包括方法,还包括可以访问相关对象的所有其他代码。

于 2013-08-23T23:42:47.003 回答
1

试试看:

作曲家.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只是一个与其他任何参数一样的参数;它不像this在 javascript 中那样)。

在方法内部,你可以做你喜欢的事,PEP 8 不会警告不要在外部定义实例变量__init__(),但如果你不这样做,你的代码会更容易理解。

于 2013-08-23T23:45:56.647 回答
0

在init之外分配 self 属性违反 PEP 8,但您仍然可以这样做。self.nationality 不应该工作,因为 self 没有定义。即使您找到了解决方法,我也不建议您这样做。

编辑:我的错误。我将 pylint 警告与 pep 8 风格混淆了。但是,还是不要这样做。

于 2013-08-23T23:43:09.153 回答