一个变量二值Python

时间:2014-04-04 17:44:51

标签: python

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

有人可以告诉我这里发生了什么吗?

3 个答案:

答案 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__()中的类实例化中被遮蔽。

因此每个对象都有一个实例变量,其中包含54,您可以使用b.nums resp。 c.nums

但是,当您使用@classmethod时,所有方法都会在类上运行。

因此,self应替换为cls,因为它实际上代表了类。

他们修改了所有实例共享的类属性nums