python类中的静态变量声明



下面两个例子的区别是什么?

#Example 1
class Foo:

var = None

def __init__(self):
self.var = 1

#Example 2
class Bar:
var = None

def __init__(self):
Foo.var = 1

var在两个例子中有什么不同?

Example 1是一个静态变量还是一个不正确的使用变量声明作为静态变量?

简写

  • Foo.var更改类状态
  • self.var改变对象状态
class Foo():
var = None

def __init__(self):
Foo.var = 1
class Bar():
var = None
def __init__(self):
self.var = 1
print('Foo before', Foo.var)
print('Bar before', Bar.var)
foo = Foo()
bar = Bar()
print('foo', foo.var)
print('bar', bar.var)
print('Foo after', Foo.var)
print('Bar after', Bar.var)
Foo.var = 2
Bar.var = 2
print('foo after class changed', foo.var)
print('bar after class changed', bar.var)

输出:

Foo before None
Bar before None
foo 1
bar 1
Foo after 1
Bar after None
foo after class changed 2
bar after class changed 1
关于第二个问题:

例1是静态变量还是不正确地使用变量声明作为静态变量?

两个var都是静态(或类)变量。可以在不创建实例的情况下调用它们。(Foo.var,Bar.var)

class Foo():
class_variable = 'c'

def __init__(self):
self.instance_variable = 'i'
print('Class variable of class', Foo.class_variable)
try:
print(Foo.instance_variable)
except Exception as e:
print('This error happens when we call instance variable without creating instance')
print(e)
instance = Foo()
print('Class variable of instance', instance.class_variable)
print('Instance variable of instance', instance.instance_variable)
Class variable of class c
This error happens when we call instance variable without creating instance
type object 'Foo' has no attribute 'instance_variable'
Class variable of instance c
Instance variable of instance i

FooBar的示例更改为汽车和卡车,因为我认为熟悉的对象可能更容易理解:

#Example 1
class Car:

age = None

def __init__(self):
self.age = 1
def olden(self):
self.age += 1

#Example 2
class Truck:
age = None

def __init__(self):
Truck.age = 1

def olden(self):
Truck.age += 1
print("---Cars---")
accord = Car()
print(f"{accord.age=}")
accord.olden()
print(f"{accord.age=}")
camry = Car()
print(f"{camry.age=}")
print(f"{accord.age=}")
print("n---Trucks---")
ram = Truck()
print(f"{ram.age=}")
ram.olden()
print(f"{ram.age=}")
f150 = Truck()
print(f"{f150.age=}")
print(f"{ram.age=}")

这个打印

---Cars---
accord.age=1
accord.age=2
camry.age=1
accord.age=2
---Trucks---
ram.age=1
ram.age=2
f150.age=1
ram.age=1

发生的事情是汽车的变量被self访问,由于雅阁和凯美瑞是独立的汽车对象,它们可以独立老化。

卡车的变量被Truck访问,所以创建一个F150重置了现有Ram的age

最新更新