用静态变量理解self的行为

时间:2016-09-29 19:12:28

标签: python static-variables

在处理python中的静态变量时,我对self的行为感到困惑。据我所知,静态变量可以通过classname.variablenameself.variablename来访问。但是,更改该变量的值会有所不同。我意识到,如果我通过classname.variablename=SomeValue更改静态变量值,则实例变量反映该值,但是如果我使用self.variablename=SomeValue更改静态变量的值,则静态变量在classname.variablename之类的访问时不会更改根据我的理解,当我分配像self.variablename=SomeValue这样的值时,就会创建一个实例变量。有人可以对这种行为略微说清楚。

示例1:

class bean:
    mycar="SomeCar"
    def test(self):
        bean.mycar = "yup"
        print(self.mycar) #prints yup

示例2:

class bean:
        mycar="SomeCar"
        def test(self):
            self.mycar = "pup"
            print(bean.mycar) #SomeCar

2 个答案:

答案 0 :(得分:1)

python中的

self是一个普通的名称,它绑定对调用类方法的实例的引用。它作为方法的第一个参数传递,按照惯例,它被绑定到名称' self'。调用self.variable = value时,您要设置实例变量的值;该特定 bean唯一的变量。

例如,self.name = "Fred"可能会命名我母亲的豆子,但我将自己的豆命名为#34; George"当我从我的 bean调用self.name时。

另一方面,bean.name = "Yousef"命名所有 bean。我母亲的豆现在被命名为#34; Yousef",我的也是。

如果我的爸爸也有一个豆子,他会惊讶地发现它也被称为" Yousef"当他打电话给bean.name时。但是他仍然可以使用self.name给他的bean提供自己的(可能是唯一的)名称。

示例代码:

class bean:
    name = "Yousef"  # All beans have this name with `bean.name`

moms = bean()
mine = bean()
dads = bean()

beans = [moms, mine, dads]

# Primitive tabular output function
def output(bean_list):
    print("-bean-", "\t", "-self-")
    for b in bean_list:
        print(bean.name, "\t", b.name)
    print("") # Separate output sets with a newline

# Print the names with only the class attribute set
output(beans)

# Python magic using zip to apply names simultaneously
# Mom's bean is "Fred", mine is "George"
# My dad is weird and named his "Ziggaloo"
for b, n in zip(beans, ["Fred", "George", "Ziggaloo"]):
    b.name = n

# Print the names after applying `self.name`
output(beans)

Python 3.4输出:

-bean-   -self-
Yousef   Yousef
Yousef   Yousef
Yousef   Yousef

-bean-   -self-
Yousef   Fred
Yousef   George
Yousef   Ziggaloo

答案 1 :(得分:1)

类和实例都可以具有属性。

将class属性分配给类对象。人们有时称之为"静态变量"

将实例属性分配给实例("实例变量" )。

当一个对象的属性是时,会发生很多事情(参见Descriptor HowTo Guide),但简短版本是:

  1. 尝试从实例中读取属性
  2. 如果失败,请尝试从课程
  3. 中阅读

    时,则没有这样的机制。它写在写的地方;)

    参见示例:

    class A(object):
        pass
    
    a = A()
    
    print A.value  # fails - there is no "value" attribute
    print a.value  # fails - there is no "value" attribute
    
    A.value = 7
    
    print A.value  # prints 7
    print a.value  # also prints 7 - there is no attribute on instance, but there is on class
    
    a.value = 11
    
    print A.value  # prints 7
    print a.value  # prints 11 - now there is an attribute on the instance
    
    a2 = A()
    
    print a2.value  # prints 7 - this instance has no "value", but the class has
    

    <强>自吗

    BTW,self参数(在问题中)是一个实例,就像a在这里一样。