下面两个例子的区别是什么?
#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
将Foo
和Bar
的示例更改为汽车和卡车,因为我认为熟悉的对象可能更容易理解:
#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
。