Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对象方法内部和外部的变量_Python_Class_Object_Variables_Methods - Fatal编程技术网

Python 对象方法内部和外部的变量

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

我刚刚开始学习Python中的类和对象,我遇到了以下问题

在我在某些情况下定义的方法中,它似乎不适用于变量n:

例如:

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]