一个变量两个值 Python

2024-10-02 20:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我们的人民。 我有一个变量(至少一个名称),但当我尝试以不同的方式访问时,它的值是不同的。这是密码。你知道吗

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类,并直接访问变量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()。你知道吗

有人能告诉我这是怎么回事吗??你知道吗


Tags: inself名称add密码forreturndef
3条回答

乍一看,我们在类级别有一个nums似乎无关紧要:

它在__init__()中的类实例化时被隐藏。你知道吗

因此每个对象都有一个实例变量,其中包含54,这是通过b.numsresp得到的。c.nums。你知道吗

但是所有的方法都在类上操作,因为您使用@classmethod。你知道吗

因此,self应该被cls替换,因为它真正代表了类。你知道吗

它们修改类属性nums,所有实例都共享该属性。你知道吗

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()

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

相关问题 更多 >