[Python] Class attribute vs. Instance attribute 觀念和差異

George
George’s Note & Idea
4 min readApr 10, 2021

--

延續上次的觀念: [Python] class __init__(self) 基本概念,我們來釐清楚 class attribute 跟 instance attribute 的差異吧!

首先說明定義:

  1. 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,定義完之後還有什麼差異跟觀念需要注意呢?

  1. 當實體化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}

如果你覺得文章很棒或有幫助到您,不妨幫我點個拍手吧! 謝謝…

--

--