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属性, 没有找到就去父类中寻找<br><br>#结果

# 打印结果
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类中,不要使用引用类型,作为参数的默认值;
原因:当类函数调用未传参,默认参数初始化的时候,默认参数是一个类变量,实例变量仅仅是类变量的引用。造成实例之间数据错乱。

~ ~~~~~~ 待续 ~~~~~~ ~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。