在处理python中的静态变量时,我对self的行为感到困惑。据我所知,静态变量可以通过classname.variablename
或self.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
答案 0 :(得分:1)
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)
-bean- -self-
Yousef Yousef
Yousef Yousef
Yousef Yousef
-bean- -self-
Yousef Fred
Yousef George
Yousef Ziggaloo
答案 1 :(得分:1)
类和实例都可以具有属性。
将class属性分配给类对象。人们有时称之为"静态变量" 。
将实例属性分配给实例("实例变量" )。
当一个对象的属性是读时,会发生很多事情(参见Descriptor HowTo Guide),但简短版本是:
当写时,则没有这样的机制。它写在写的地方;)
参见示例:
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
在这里一样。