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

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

时间:2022-08-17 14:56:50浏览次数:60  
标签:__ name Python self object 多态 面向对象编程 print 父类

继承

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

继承的使用

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()

标签:__,name,Python,self,object,多态,面向对象编程,print,父类
From: https://www.cnblogs.com/Lz-heng/p/16595186.html

相关文章

  • [Python学习笔记]Python基础-14 文件操作
    打开文件python中,使用open内置函数打开并操作一个文件open参数介绍file=open('xxx.txt',r,encoding='utf-8')file:用来指定的打开的文件(文件路径)mode:打......
  • Python爬虫之多线程异步爬虫,非常详细
    Python爬虫之多线程爬虫在使用Python的过程中,我们可能遇到这样一个场景,需要下载某一个网站上的多个资源;例如:我们想下载豆瓣电影Top250所有的宣传图片具体代码如下......
  • Python逆向爬虫之pyquery,非常详细
    系列目录Python逆向爬虫之pyquerypyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了......
  • 手写卷积单元-python
    一个文本卷积模块defcnn():importnumpyasnpresult=[]n,dim=10,30kernels=[np.random.randint(0,2,(i,dim))foriinrange(3,6)]#......
  • 非常全的一份Python爬虫的Xpath博文
    非常全的一份Python爬虫的Xpath博文Xpath是python爬虫过程中非常重要的一个用来定位的一种语法。一、开始使用首先我们需要得到一个HTML源代码,用来模拟爬取网页中......
  • Python爬虫之bs4,非常详细
    Python爬虫之bs4,非常详细bs4全名BeautifulSoup,是编写python爬虫常用库之一,主要用来解析html标签。一、初始化pipinstallbs4frombs4importBeautifulSoups......
  • Python小程序(二):巡检H3C网络设备
    Python小程序(二):巡检H3C网络设备读取设备列表或txt文件,自动化巡检H3C设备。importnetmikofromnetmikoimportConnectHandler,NetmikoBaseExceptionimportdatetime,t......
  • Python逆向爬虫之正则表达式
    Python逆向爬虫之正则表达式字符串是我们在编程的时候很常用的一种数据类型,检查会在字符串里面查找一些内容,对于比较简单的查找,字符串里面就有一些内置的方法可以处理,对于......
  • Python 字典排序
    字典是“键-值对”的无序可变序列在实际运用中,对字典进行排序是一个比较常见的操作,主要用到了python内置函数sorted(),该函数可以对所有可迭代的对象进行排序操作。语法(pyth......
  • 批量产生文件夹(Python)
    1、指定文件夹路径,在该路径下批量生成指定名称(具有一定的规律性)的文件夹#导入OS库importosFilePath=""#指定文件夹路径NumSets=#文件夹个数defBatProFile_......