[Python] Class attribute vs. Instance attribute 觀念和差異
Published in
4 min readApr 10, 2021
延續上次的觀念: [Python] class __init__(self) 基本概念,我們來釐清楚 class attribute 跟 instance attribute 的差異吧!
首先說明定義:
Class Attribute
即為定義在constructor的外面,稱之Class attribute
。
class ExampleClass(object):
# class attribute.
class_attr = 0
2. Instance Attribute
即為定義在constructor的裡面,稱之 Instance Attribute
。
class ExampleClass(object):
def __init__(self, instance_attr):
# instance attribute.
self.instance_attr = instance_attr
OK,定義完之後還有什麼差異跟觀念需要注意呢?
- 當實體化class之後,
class attribute
就會被設定一樣的初始值,反之Instance Attribute
則否,因為初始值是由外部引數設定。
class ExampleClass(object):
# class attribute.
class_attr = 0
def __init__(self, instance_attr):
# instance attribute.
self.instance_attr = instance_attr
if __name__ == '__main__':
foo = ExampleClass(1)
bar = ExampleClass(2)
print('foo\'s instance attr: ', foo.instance_attr, '; class attr: ', foo.class_attr)
print('bar\'s instance attr: ', bar.instance_attr, '; class attr: ', bar.class_attr)>>> foo's instance attr: 1 ; class attr: 0
>>> bar's instance attr: 2 ; class attr: 0
2. class attribute
可以被當作 Instance Attribute
使用,不會受到其他實體化物件影響。
class ExampleClass(object):
# class attribute.
class_attr = 0
def __init__(self, instance_attr):
# instance attribute.
self.instance_attr = instance_attr
if __name__ == '__main__':
foo = ExampleClass(1)
bar = ExampleClass(2)
foo.class_attr = 3
print('foo\'s instance attr: ', foo.instance_attr, '; class attr: ', foo.class_attr)
print('bar\'s instance attr: ', bar.instance_attr, '; class attr: ', bar.class_attr)>>> foo's instance attr: 1 ; class attr: 3
>>> bar's instance attr: 2 ; class attr: 0
3. 請注意你修改使用 class attribute
之後,Instance Attribute
會把你修改後的 class attribute
放到 Instance Attribute
。
if __name__ == '__main__':
foo = ExampleClass(1)
bar = ExampleClass(2)
foo.class_attr = 3 print(foo.__dict__)
print(bar.__dict__)>>> {'instance_attr': 1, 'class_attr': 3}
>>> {'instance_attr': 2}
如果你覺得文章很棒或有幫助到您,不妨幫我點個拍手吧! 謝謝…