Hy人。 我有一个变量(至少有一个名称)但是当我尝试以不同的方式访问它时它具有不同的值。这是代码。
class Sabirac(object):
nums=[]
def __init__(self):
self.nums=[5,4]
for i in range (1,11):
self.add(randint(1, 100))
@classmethod
def add(self,num):
self.nums.append(num)
@classmethod
def calc_sum(self):
csum=0
for num in self.nums:
csum=csum+num
return csum
@classmethod
def ispis(self):
return self.nums
这是输出。
b=Sabirac()
b.nums
[5, 4]
b.ispis()
[85, 72, 6, 42, 34, 20, 77, 89, 91, 47]
c=Sabirac()
c.ispis()
[85, 72, 6, 42, 34, 20, 77, 89, 91, 47, 36, 61, 81, 41, 60, 42, 67, 56, 40, 99]
c.nums
[5, 4]
所以我将类Sabirac和access直接发送到变量nums并输出
[5, 4]
之后我通过方法ispis()访问同一个变量。然而,它给了我完全不同的价值
[85, 72, 6, 42, 34, 20, 77, 89, 91, 47]
然后,如果我创建类c = Sabirac()的新实例并调用c.ispis(),我的输出将是:
[85, 72, 6, 42, 34, 20, 77, 89, 91, 47, 36, 61, 81, 41, 60, 42, 67, 56, 40, 99]
请注意,只是将10个值附加到b.ispis()。
有人可以告诉我这里发生了什么吗?
答案 0 :(得分:1)
nums
是一个类变量。不是实例变量。如果您希望nums
成为对象变量,则必须声明为该类的__init__
方法(或其他方法)。
例如:
class X:
class_var = 3
def __init__(self):
X.class_var = X.class_var + 1
self.instance_var = 3
>>> a = X()
>>> print(a.class_var)
>>> 4
>>> print(a.instance_var)
>>> 3
>>> b = X()
>>> print(b.class_var)
>>> 5
>>> print(a.instance_var)
>>> 3
答案 1 :(得分:0)
class Sabirac(object):
nums=[]
def __init__(self):
self.nums=[5,4]
for i in range (1,11):
self.add(randint(1, 100))
def add(self,num):
self.nums.append(num)
def calc_sum(self):
csum=0
for num in self.nums:
csum=csum+num
return csum
def ispis(self):
return self.nums
不要让你的方法类方法......很明显你缺乏一些关于这些方法的知识
例如
class People:
my_people = {}
def __init__(self,name,age):
self.name = name
self.age = age
People.my_people[name] = self
def birthday(self):
#a birthday happens to an instance (or a person, not to people in general)
self.age += 1
@classmethod
def get_person(cls,name):
#this is asking the People class for an instance of a person
return cls.my_people[name]
billy = People("billy",8)
billy.birthday()
susan = People("susan",12)
#somewhere else
susan = People.get_person("susan") #call the classmethod
susan.birthday()
答案 2 :(得分:0)
乍一看,我们在班级有一个nums
似乎无关紧要:
它会在__init__()
中的类实例化中被遮蔽。
因此每个对象都有一个实例变量,其中包含5
和4
,您可以使用b.nums
resp。 c.nums
。
但是,当您使用@classmethod
时,所有方法都会在类上运行。
因此,self
应替换为cls
,因为它实际上代表了类。
他们修改了所有实例共享的类属性nums
。