iOS开发人员如何学习Python编程18-面向对象编程4

140 阅读3分钟

这是我参与11月更文挑战的18天,活动详情查看:2021最后一次更文挑战

面向对象三大特性

面向对象的三大特性是指:

  • 封装
  • 继承
  • 多态

封装

封装是面向对象编程的一大特点,将属性和方法放到类的内部,通过对象访问属性或者方法,隐藏功能的实现细节,也可以设置访问权限。

class Student:
    def __init__(self,name,age):
        self.name = name           # 字段封装到了类的内部
        self.age = age

    def prin_info(self):
        # print(ls.name,ls.age)
        print(self.name,self.age)


ls = Student("李四",18)
# ls.name = "李四"  				 # 字段(属性)定义在类的外部
# ls.age = 18
ls.prin_info()

继承

继承是一种创建新类的方式,如果子类需要复用父类的属性或者方法时,就可以使用继承。当然,子类也可以提供自己的属性和方法。

class Father:		 # 父类 超类
    pass 

class Son(Father):   # 子类 派生类
    pass

⚠️注意:在python中,新建的类可以继承一个或多个父类。

新式类与经典类

Python2当中类分为新式类和经典类,如果有继承父类object则是新式类,否则为经典类。

但是在Python3当中,全部都是新式类,默认继承object
通过比较继承与无继承两个空类的成员是否一致来验证Python3中,全部都是新式类,比较继承与无继承两个空类的成员是否一致:

对象.__dir__():查看对象的属性与方法

class Father(object):  
    pass
    
class Son:             
    pass
    
f = Father()
s = Son()
    
print(len(f.__dir__()))     # 26
print(len(s.__dir__()))     # 26

单继承

子类继承父类,则可以直接享受父类中已经封装好的方法:

class GrandFather(object):
    def sleep(self):
        print("GrandFather sleep")


class Father(GrandFather):
    def eat(self):
        print("Father eat")

    def drink(self):
        print("Father drink")


class Son(Father):
    def study_py(self):
        print("Son stupy python")

s = Son()
s.study_py()
s.eat()         
s.sleep()

当对象调用方法时,查找顺序先从自身类找,如果自身没找到,则去父类找,父类无,再到父类的父类找,直到object类,若还无,则报错。这也称为深度优先机制。

但是需要注意的是,当子类与父类拥有同名称的方法时,子类对象调用该方法优先执行自身的方法。那么实际上就是子类的方法覆盖父类的方法,也称为重写:

class GrandFather(object):
    def sleep(self):
        print("GrandFather sleep") 
        
class Father(GrandFather):
    def eat(self):
        print("Father eat")
        
    def drink(self):
        print("Father drink")
        
class Son(Father):
    def study_py(self):
        print("Son stupy python")
        
    def sleep(self):
        print("Son sleep") 
        
s = Son()
s.study_py()
s.eat()         
s.sleep()     # Son sleep

但是实际的开发中,遵循开放封闭原则。我们并不会完全的重写父类的方法,而是希望同时实现父类的功能。这时,我们就需要调用父类的方法了,可以通过super()函数实现。

super()

super()函数是用于调用父类(超类)的一个方法。语法:

super(type[, object-or-type])
  • type:类;
  • object-or-type:类,一般是self
总结
  • 继承:深度优先。先从自己找,找不到则往父类找。
  • 重写(防止执行父类中的方法)。
  • self永远是执行该方法的调用者。
  • super(子类,self).父类中的方法(arg) 或者 父类名.父类中的方法(self,arg)。

⚠️注意:

  • __init__方法也会继承,同实例方法一致
  • 私有属性以及私有方法没有被继承