Python|Python 难点随笔

最近在学习使用python,也做了一些项目,还是觉得要记录一下,避免很多坑趟过之后就忘记了
一,python类继承

  • 方法调用
class Foo: def f1(self): print('Foo.f1') def f2(self): #self=obj print('Foo.f2')#在父类中找到发 f2属性,第3步打印这一行 self.f1() #obj.f1()第4步再去掉用self的f1属性 class Bar(Foo): def f1(self):#第五步, 在回到object自身的名称空间找f1属性,找到后调用 print('Bar.f1') #第6步 执行 obj=Bar() #第一步 :类的实例化, 先得到一个空对象, obj.f2()#第2步:空对象调用f2属性 在自身寻找f2属性, 没有找到就去父类中寻找

#结果# 打印结果 Foo.f2 Bar.f1 # 理解重点:self代表的是实例,故先从自身查找,没有找到才会找父类,所以打印的是Bar的f1

  • super
    super是用来手动调用父类的,python3中更是简化了写法:super().xx(self)即可
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2)# 3

坑点:如果在子类的init()中使用super().xx(self)需要注意,谨慎起见,需先调用super().init(),如果在其他方法中则可直接使用(比如在pyqt5,UI编程的时候,必须先调用super().init(),初始化UI组件)
继承中的_ init _
当在Python中出现继承的情况时,一定要注意初始化函数init的行为:
  • 如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
  • 如果子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
  • 如果子类定义了自己的初始化函数,在子类中显示调用父类,子类和父类的属性都会被初始化
二,默认参数的坑
在Python类中,不要使用引用类型,作为参数的默认值;
原因:当类函数调用未传参,默认参数初始化的时候,默认参数是一个类变量,实例变量仅仅是类变量的引用。造成实例之间数据错乱。
【Python|Python 难点随笔】~ ~~~~~~ 待续 ~~~~~~ ~

    推荐阅读