[Python学习笔记]Python基础-13 面向对象编程_继承和多态

继承

  • 面向对象的编程有三大特性
    • 封装:
      • 函数是对语句的封装
      • 类是对函数和变量的封装
    • 继承
      • 类和类之间可以人为,手动的建立父子关系
      • 父类的属性和方法,子类可以使用
    • 多态
      • 是一种技巧
      • 可以提供代码的灵活度

继承的使用

class Animals(object):
    def __init__(self,name,age) -> None:
        self.name = name
        self.age = age
    
    def sleep(self):
        print('{}正在睡觉'.format(self.name))


class Dog(Animals):
    def bark(self):
        print('{}正在叫'.format(self.name))

# Dog() 调用 __new__ 方法,再调用 __init__ 方法
# Dog 中没有 __new__ 方法,会查看父类是否重写了 __new__ 方法
# 父类中也没有重写 __new__ 方法,会查找父类的父类,查找到 object

# 调用 __init__ 方法,Dog类没有实现,会自动查找 Animal 父类
d1 = Dog('大黄',3)
print(d1.name)  # 父类中定义的属性,子类可以直接调用
d1.bark()  # 子类中自己定义的方法,自己使用
d1.sleep()  # 父类中定义的方法,实例对象可以直接调用

继承的注意事项

  • 在定义类时,如果不写父类,在Pyhton3中,默认继承自object,如下:class C:
  • 继承可以传递,如B继承自A,C继承自B,那么A类中的各类属性和方法,C类中也可用
  • 在Python中,允许多继承,如下:class C(A,B):
    • 如果有两个不同的父类中,有同名的不同方法;A类中有foo方法,B类中也有foo方法(深度优先)
    • 有一个类对象的属性可以查看方法的调用顺序 __mro__
    • 依次查找,全都没有则报错

私有属性的集成特点

  • 类中自己定义的私有方法,可以通过 对象名._类名__私有方法名() 方法进行调用
  • 父类的私有方法,子类不会继承
  • 父类的私有属性,子类不会继承

新式类和经典类

# 手动的指定 Studen 类继承自 object
class Student(object):
    pass

# 没有指定 Dog 的父类,Python3中默认继承自 object
class Dog:
    pass
  • 新式类和经典类的概念:
    1. 新式类:继承自 object 的类我们称之为新式类
    1. 经典类:不继承自 object 的类
  • Python2中,如果不手动指定的一个类的父类是object,这个类就是一个经典类
  • Python3中,不存在经典类,都是新式类

Python2和Python3的区别

  • 八进制数据的表示方式

    • Python2里,0o开始的数字是八进制,以 0 开始的数字也是八进制
      • 032 ==> 八进制的32
      • 0o32 ==> 八进制的32
      • 079 ==> 十进制的79
    • Python3里,八进制只能使用 0o开头
  • 除法运算符的区别

    • python2里两个整数相除得到的结果是一个整数。 10 / 3 ==> 3
    • python3里两个整数相除的结果是一个浮点数。 10 / 3 = 3.3333333
  • 比较运算符的区别

    • Python2里可以使用!=和 <> 来表示不等于运算符
    • python3里不再支持 <>,只能使用 != 表示不等运算符
  • 字符串的表示方式

    • Python2里可以使用反引号``来表示字符串
    • Python3里不再支持反引号 ``
  • print语句的区别

    • Python2里支持 print 'hello' 这种写法
    • Python3里支持 print('hello')
  • input语句的区别

    • Python2里的input,会把用户的输入当做代码,根据用户输入的内容来确定类型;raw_input和Python3里的input功能一致
    • Python3直接接受用户的输入,所有的数据都是字符串类型,Python3里的input相当于Python2里的raw_input;Python3里不再支持raw_input了
  • 中文的支持

    • Python2默认不支持中文,需要在代码的最前面写注释,让它支持中文
      -*-coding:utf8-*-
    • Python3默认支持中文
  • 新式类和经典类

    • 经典类:不继承自object的类,称之为经典类
    • 新式类:继承自object的类
    • Python3不再支持经典类,都是新式类,一个类如果不指定父类,默认都继承自object

面向对象的方法

  • is 身份运算符是用来比较是否是同一个对象
  • type type方法,获取的是类对象
  • isinstance 用来判断一个对象是否是由指定的类(或者父类)实例创建出来的
  • issubclass 用来判断一个类是否是另一个类的子类
  • 代码示例如下:
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

class X(object):
    pass

class Student(Person, X):
    pass

p1 = Person('张三', 18)
p2 = Person('张三', 18)
s = Student('jack', 20)

# 获取两个对象的内存地址   id(p1) == id(p2)
print(p1 is p2)  # is 身份运算符运算符是用来比较是否是同一个对象

# type(p1)   # 其实获取的就是类对象
print(type(p1) == Person)

# s这个实例对象是否是由Student类创建的?
print(type(s) == Student)
print(type(s) == Person)  # False

# isinstance 用来判断一个对象是否是由指定的类(或者父类)实例化出来的
print(isinstance(s, (Student, X)))  # True
print(isinstance(s, Person))  # True

print(isinstance(p1, Person))  # True
print(isinstance(p1, Student))  # False

# issubclass 用来判断一个类是否是另一个类的子类
print(issubclass(Student, (Person, X)))  # True
print(issubclass(Person, Student))  # False

多态

子类重写父类方法

  • 继承特点:
    • 如果一个类A,继承自类B,由A创建出来的实例对象都可以使用类B中的方法
    1. 子类的实现和父类的实现完全不一样,子类可以选择重写父类的方法
    1. 在父类的基础上,又有更多的实现
    • 调用父类的方法的两种方式
      • 使用父类名.__方法名__(self,参数)调用父类的方法
      • 使用super().__init__(参数列表)直接调用父类的方法
      • 推荐使用super方式
    • 演示代码如下:
class Person(object):
    def __init__(self,name,age) -> None:
        self.name = name
        self.age = age

    def sleep(self):
        print(self.name + '正在睡觉')

class Students(Person):
    def __init__(self, name, age,school) -> None:
        # Person.__init__(self,name,age)  # 使用父类名.__方法名__(self,参数) 调用父类的方法
        super().__init__(name, age)  # 使用super直接调用父类的方法
        self.school = school

    def sleep(self):
        print(self.name + '正在课间休息')  # 此处重写父类的sleep方法
    
    def study(self):
        print(self.name + '正在学习')

s = Students('jerry',20)  # 调用了父类的 __init__ 方法
s.sleep()  # 重写后,输出 ==> jerry正在课间休息

多态的使用

  • 多态是基于继承的,通过子类重写父类的方法
  • 达到不通的子类对象调用相同的父类方法,得到不同的结果
  • 提高代码的灵活度
class Dog(object):
    def work(self):
        print('狗正在工作')

class KeJi(Dog):
    def work(self):
        print('柯基犬正在工作')

class SaMo(Dog):
    def work(self):
        print('萨摩犬正在工作')

class XiShi(Dog):
    def work(self):
        print('西施犬正在工作')

class Person(object):
    def __init__(self,name) -> None:
        self.name = name
        self.dog = None
    
    def work_with_dog(self):  # 此处不需要针对每种不同类型的狗,定义不同的work_with_dog方法
        if self.dog is not None and isinstance(self.dog,Dog):
            self.dog.work()

p = Person('张三')

xs = XiShi()
p.dog = xs
p.work_with_dog()
posted @   Lz-heng  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示