下面是今日python编程学习总结:
1、super关键字产生的原因:在子类当中可以通过使用super关键字来调用父类的中相应的方法,简化代码。
使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表。
示例代码:
#!/usr/bin/python # -*- coding:utf-8 -*- class Foo: def test(self): print("from foo") class Bar(Foo): def test(self): #Foo.test(self) super().test() print("bar") if __name__ == '__main__': bb = Bar() bb.test()
运行结果:
2,类变量的可变属性
(1)如果通过类的实例改变了变量,类变量也会发生改变,下面是例子
class Service(object): data = [] def __init__(self, other_data): self.other_data = other_data
(2)在上面的代码中,在Service的命名空间中定义一个data,其初始值为空list,现在通过对象来改变它
s1 = Service(['a', 'b'])
s2 = Service(['c', 'd'])
s1.data.append(1)
s1.data
## [1]
s2.data
## [1]
s2.data.append(2)
s1.data
## [1, 2]
s2.data
(3)可以看到,如果属性是可变的,在对象中改变这个属性,将会影响到类的命名空间。
可以通过赋值防止对象改变类变量。
s1 = Service(['a', 'b']) s2 = Service(['c', 'd']) s1.data = [1] s2.data = [2] s1.data ## [1] s2.data ## [2] Service.data [1,2]
在Service类里定义了一个类变量data,注意当我们执行s1.data.append(1)时,对这个类变量进行了修改,增加了一个1.而当我们执行s1.data = [1]时,我们并没有更改类变量data,而是给s1增加了一个变量data,原来的类变量不受影响,Service.data依旧是[1,2]。这一点要特别注意。append和赋值是两种完全不同的操作。实例无法修改类变量的指向,但可以修改类变量指向的内容,注意修改类变量的指向和修改类变量指向的内容是不同的概念。