Python 可以在类中的任何位置指定属性吗?

Python 可以在类中的任何位置指定属性吗?,python,class,attributes,Python,Class,Attributes,可以在类中的任何位置指定属性吗?如果是,范围规则如何适用于以下每种情况 class GreatComposers(object): def __init__(self, name, birthday, instrument): # attributes assigned in __init__ self.name = name self.birthday = birthday self.instrument = instr

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

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'

不,它在类范围内不起作用(在您的示例中,
self.national='german'
),因为此时范围内没有名称
self
。它在其他情况下不起作用,因为方法或
self
参数在某种程度上是特殊的。可以在对象引用的任何位置指定属性。这包括方法,但也包括有权访问所讨论对象的所有其他代码。

否,它在类范围内不起作用(
self.national='german'
),因为此时范围内没有名称
self
。它在其他情况下不起作用,因为方法或
self
参数在某种程度上是特殊的。可以在对象引用的任何位置指定属性。这包括方法,但也包括有权访问所讨论对象的所有其他代码。

init之外分配self属性不利于PEP 8,但您仍然可以这样做。但是self.national不应该起作用,因为self没有定义。即使你在这方面找到了工作,我也不建议你这么做


编辑:我的错误。我把派林警告和pep 8风格混淆了。但是,还是不要这样做。

init之外分配自我属性不利于PEP 8,但您仍然可以这样做。但是self.national不应该起作用,因为self没有定义。即使你在这方面找到了工作,我也不建议你这么做

编辑:我的错误。我把派林警告和pep 8风格混淆了。但还是不要这样做。

试试看:

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'
class GreatComposer(对象):
定义初始(自我、姓名、生日、仪器):
#在u_init中指定的属性__
self.name=名称
生日
self.instrument=instrument
def setFullName(self):#>导入作曲家
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“composers.py”,第1行,在
类GreatComposer(对象):
GreatComposer中第17行的文件“composers.py”
self.national=‘德语’
NameError:未定义名称“self”
回溯告诉您,在方法之外,您不能将任何内容分配给
self.national
,因为
self
不存在(请记住,
self
与其他任何参数一样只是一个参数;它与javascript中的
this
不同)

在方法内部,您可以随心所欲,并且不会警告您不要在
\uuuu init\uuuu()
之外定义实例变量,但如果您不这样做,您的代码将更容易理解。

试试看:

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'
class GreatComposer(对象):
定义初始(自我、姓名、生日、仪器):
#在u_init中指定的属性__
self.name=名称
生日
self.instrument=instrument
def setFullName(self):#>导入作曲家
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“composers.py”,第1行,在
类GreatComposer(对象):
GreatComposer中第17行的文件“composers.py”
self.national=‘德语’
NameError:未定义名称“self”
回溯告诉您,在方法之外,您不能将任何内容分配给
self.national
,因为
self
不存在(请记住,
self
与其他任何参数一样只是一个参数;它与javascript中的
this
不同)

在方法内部,您可以随心所欲,并且不会警告您不要在
\uuuu init\uuuu()
之外定义实例变量,但是如果您不这样做,代码将更容易理解