Python 对象方法内部和外部的变量
我刚刚开始学习Python中的类和对象,我遇到了以下问题 在我在某些情况下定义的方法中,它似乎不适用于变量n: 例如:Python 对象方法内部和外部的变量,python,class,object,variables,methods,Python,Class,Object,Variables,Methods,我刚刚开始学习Python中的类和对象,我遇到了以下问题 在我在某些情况下定义的方法中,它似乎不适用于变量n: 例如: def play(self): if n < 4: n += 1 self.mood = moods[n] else: self.mood = self.mood 我是不是缺少一些基础知识 import random moods = ['terrible', 'bad',
def play(self):
if n < 4:
n += 1
self.mood = moods[n]
else:
self.mood = self.mood
我是不是缺少一些基础知识
import random
moods = ['terrible',
'bad',
'neutral',
'good',
'great']
n = random.randint(0,2)
class animals:
def __init__(self, species, name, mood):
self.species = species
self.name = name
self.mood = mood
def default_mood(self):
self.mood = moods[2]
def new_mood(self):
n = random.randint(0,2)
self.mood = moods[n]
def play(self):
if n < 4:
n += 1
self.mood = moods[n]
else:
self.mood = self.mood
Max = animals('Dog', 'Max', moods[n])
Princess = animals('Cat', 'Princess', moods[n])
print(Max.name + ' mood is ' + Max.mood)
print(Princess.name + ' mood is ' + Princess.mood)
Max.new_mood()
Max.play()
Princess.play()
print(Max.name + ' mood is ' + Max.mood)
print(Princess.name + ' mood is ' + Princess.mood)
print(Max.mood)
print(Max.name + ' mood is ' + Max.mood)
print(Princess.name + ' mood is ' + Princess.mood)
随机导入
情绪=[“糟糕”,
“坏”,
“中立”,
“好”,
“太好了”]
n=random.randint(0,2)
类动物:
定义初始(自我、物种、名称、情绪):
self.species=物种
self.name=名称
自我情绪
def默认情绪(自我):
self.mood=情绪[2]
def新情绪(自我):
n=random.randint(0,2)
self.mood=情绪
def播放(自我):
如果n<4:
n+=1
self.mood=情绪
其他:
self.mood=self.mood
最大值=动物(‘狗’、‘最大值’、情绪[n])
公主=动物(‘猫’、‘公主’、‘情绪’)
打印(Max.name+“mood is”+Max.mood)
打印(Princess.name+“mood is”+Princess.mood)
最大新情绪()
最大播放次数()
公主
打印(Max.name+“mood is”+Max.mood)
打印(Princess.name+“mood is”+Princess.mood)
打印(最大情绪)
打印(Max.name+“mood is”+Max.mood)
打印(Princess.name+“mood is”+Princess.mood)
TLDR:这不是由类引起的,而是由Python中作用域的工作方式引起的。对某个名称的任何赋值都会使该名称成为局部变量,并隐藏任何同名的全局变量
使用global
或nonlocal
明确引用全局范围或包含范围的名称。使用类属性引用类范围中的名称
考虑这个没有类的最小示例:
>>> n = 5
...
>>> def foo():
... if n < 10:
... n += 1
...
>>> foo()
UnboundLocalError: local variable 'n' referenced before assignment
相关但略有不同的用例是特定于类的变量。例如,n
可能是所有动物
的特征,而不会影响(比如)所有人类
此类类属性在类的主体中定义。您可以通过类的名称引用它们,类似于获取方法的方式:
class Animals:
n = 0
def new_mood(self):
# we want the 'n' of Animals
Animals.n = random.randint(0,2)
self.mood = moods[Animals.n]
根据处理修改和子类化的方式,可以使用类属性。重新打开,因为这里建议的副本没有意义-op显然不需要全局属性。@Brunodesshuilliers怎么会这样
n
是他们试图修改的全局变量,不是吗?@UnholySheep不是-OP想要的也可能是实例属性。@Marek确定要在这里使用全局变量吗?一个animal
实例的情绪真的应该取决于之前对任何animal
实例的new\u mood()
和/或play()
调用吗?
>>> def foo():
... global n # n refers to the global name n for the entire scope
... if n < 10: # works, we compare against the global n
... n += 1 # modifies the global n, no introduction of local n
class Animals:
n = 0
def new_mood(self):
# we want the 'n' of Animals
Animals.n = random.randint(0,2)
self.mood = moods[Animals.n]