疯狂的Python-17(类属性与类实例属性)

疯狂的Python-17(类属性与类实例属性)_第1张图片

一些有趣的鲜为人知的Python特性集合

无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!

阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲


▶ 类属性与类实例属性

1.

class A:
    x = 1

class B(A):
    pass

class C(A):
    pass

Ouptut:

>>> A.x, B.x, C.x
(1, 1, 1)
>>> B.x = 2
>>> A.x, B.x, C.x
(1, 2, 1)
>>> A.x = 3
>>> A.x, B.x, C.x
(3, 2, 3)
>>> a = A()
>>> a.x, A.x
(3, 3)
>>> a.x += 1
>>> a.x, A.x
(4, 3)

2.

class SomeClass:
    some_var = 15
    some_list = [5]
    another_list = [5]
    def __init__(self, x):
        self.some_var = x + 1
        self.some_list = self.some_list + [x]
        self.another_list += [x]

Output:

>>> some_obj = SomeClass(420)
>>> some_obj.some_list
[5, 420]
>>> some_obj.another_list
[5, 420]
>>> another_obj = SomeClass(111)
>>> another_obj.some_list
[5, 111]
>>> another_obj.another_list
[5, 420, 111]
>>> another_obj.another_list is SomeClass.another_list
True
>>> another_obj.another_list is some_obj.another_list
True

:bulb: 解释:

  • 类里的属性和类实例中的属性是作为一个字典列表对象进行处理的。如果在当前类中没有找到需要调用的属性名,那么就会递归去父类中寻找。
  • +=操作符会在原有易变类型对象的基础上做改变而不会重新创建一个新的对象。所以在一个类实例中修改属性值,会影响到所有调用这个属性的相关类实例和类。

你可能感兴趣的:(疯狂的Python-17(类属性与类实例属性))