热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python基础学习Day17面向对象的三大特性之继承、类与对象名称空间小试

一、课前回顾类:具有相同属性和方法的一类事物实例化:类名()过程:开辟了一块内存空间执行init方法封装属性自动的把self返回给实例化对象的地方对

一、课前回顾

类:具有相同属性和方法的一类事物

实例化:类名()

  过程:

  开辟了一块内存空间

  执行init方法

  封装属性

  自动的把self返回给实例化对象的地方

对象:实例

  一个实实在在存在的实体

组合:

  一个类的对象 作为另一个类对象的属性

  让两个类之间产生关系

__dict__():

  查看类中所有静态属性和方法

  查看所有对象的属性、类对象指针

静态属性:类的属性,所有的对象共享这个变量

对象名:去修改 类的静态属性

  在对象的空间中有创建了一个属性,而不能修改类中属性的值

操作静态属性 应该 用类名来操作

二、面向对象的三大特性之继承

2.1继承与抽象两个概念

class Animal:                                  # 父类/超类/基类
    def __init__(self,name,kind,food):
        self.name = name
        self.kind = kind
        self.food = food
    def yell(self):
        print('喵喵叫')
    def eat(self):
        print('吃猫粮')
    def drink(self):
        print('喝水')
class Cat(Animal):                          # 类名(父类名) 就是继承
    def catch_mouse(self):
        print('抓老鼠')
class Dag(Animal):                         # 子类/派生类
    def look_after_house(self):
        print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵')        # 实例化对象
cat.yell()
dag = Dag('阿狗','土狗','狗粮','旺旺')
dag.drink()
结果为:

喵喵叫
喝水

继承:通过子类名(父类名)实现对父类方法的继承。

父类/超类/基类

子类/派生类

2.1.1 继承与重用

class Animal:                                  # 父类/超类/基类
    def __init__(self,name,kind,food,language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language
    def yell(self):
        print('%s叫'%self.language)
    def eat(self):
        print('吃%s'%(self.food))
    def drink(self):
        print('喝水')
class Cat(Animal):                          # 类名(父类名) 就是继承
    def catch_mouse(self):
        print('抓老鼠')
class Dag(Animal):                         # 子类/派生类
    def look_after_house(self):
        print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵')
cat.yell()
dag = Dag('阿狗','土狗','狗粮','旺旺')
dag.eat()
结果为:
喵喵叫
吃狗粮

重用:猫和狗的叫和吃两个方法属于重用

2.1.2派生属性

            

 

 当子类中有要被调用的方法的时候,子类的对象会直接选择子类中的方法、变量,父类中的方法不会被自动执行

如果我们既想要执行子类的方法,也想要执行父类的方法,那么需要在子类的方法中调用父类的方法:

1、父类名,方法名(self....)

2、super(),方法名(...)

这样就会帮我们在子类中调用父类中的同名方法

 

class Animal:                                  # 父类/超类/基类
    def __init__(self,name,kind,food,language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language
    def yell(self):
        print('%s叫'%self.language)
    def eat(self):
        print('吃%s'%(self.food))
    def drink(self):
        print('喝水')

class Cat(Animal):                          # 类名(父类名) 就是继承
    def catch_mouse(self):
        # Animal.drink(self)    # 子类方法中调用父类方法
        super().drink()
        print('抓老鼠')
class Dag(Animal):                         # 子类/派生类
    def look_after_house(self):
        print('看家')
cat = Cat('阿猫','橘猫','猫粮','喵喵')
cat.catch_mouse()
结果为:
喝水
抓老鼠

2.2抽象类

作用:

 多人开发、复杂的需求、后期的扩展
手段、来帮助我们完成规范
范例: 只需要了解
from abc import ABCMeta,abstractclassmethod
class Payment(metaclass=ABCMeta):    # 模板的功能
    @abstractmethod   # 它是一个装饰器,装饰器放在函数和类的上一行
    def pay(self):pass
class Alipay(Payment):
    def pay(self,money):
        print('使用支付宝支付了%s元'%money)
class Wechatpay(Payment):
    def pay(self,money):
        print('使用微信支付了%s元'%money)
class ApplePay(Payment):
    def pay(self,money):
        print('使用Applepay支付了%s元'%money)
def pay(obj,money):
    obj.pay(money)
抽象类
抽象类是一个规范,他基本不会实现什么具体的功能,抽象类是不能被实例化
要想写有一个抽象类
from abc import ABCMeta,abstractclassmethod
在这个类创建的时候,指定metaclass=ABCMeta
#在你希望子类实现的方法上加一个@abstractmethod装置器
使用抽象类
继承这个类
必须实现这个类中被@abstractmethod装饰器装饰的方法

     2.2多继承

class Parent1:pass
class Parent2:pass
class Son(Parent1,Parent2):pass
print(Son.__bases__)  # 查看该类继承的所有父类
结果为:
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
# 不是多有的语言都支持多继承 jave
# c++支持多继承
举例:
class Animal:
    def __init__(self,name):
        self.name = name
class FlyAnimal(Animal):
    def fly(self):
        print('%s在飞'%self.name)
class WalkAnimal(Animal):
    def fly(self):
        print('%s在走路'%self.name)
class SwimAnimal(Animal):
    def fly(self):
        print('%s在游泳'%self.name)
class Tiger(SwimAnimal,WalkAnimal):
    pass
class Swan(SwimAnimal,WalkAnimal,FlyAnimal):
    pass
class Parrot(FlyAnimal,WalkAnimal):
    def talk(self):
        print('%s说话了'%self.name)
swan = Swan('天鹅')
swan.fly()
parrot = Parrot('鹦鹉')
parrot.talk()
parrot.fly()
结果为:

天鹅在游泳
鹦鹉说话了
鹦鹉在飞

 

三、新式类与经典类

新式类与经典类
新式类
在Python3.0里所有类都是新式类
所有的新式类都有一个默认的父类:object
class Person1:pass
class Person2():pass
class Person3(object):pass
# p = Person()    # __init__初始化方法
print(Person1.__bases__)    #(,)
print(Person2.__bases__)    #(,)
print(Person3.__bases__)    #(,)

 python 2.7

经典类与新式类 并存
class Student:pass # 经典类
class Student(object):pass
总结:
  继承了object的类就是新式类
  在py3中所有的类都是新式类
  在py2中既有新式类又有经典类

 继承规律:

继承方法是——遵循广度优先
继承object
mro方法
super:super不是单纯的找父类,而是遵循mro顺序的
class A:
    def func(self):
        print('A')
class B(A):
    def func(self):
        super().func()
        print('B')
class C(A):
    def func(self):
        super().func()
        print('C')
class D(B,C):
    def func(self):
        super().func()
        print('D')
D().func()
结果为:
A
C
B
D

 

 图解:

 

四、类与对象名称空间

1.只要对象的某个属性被直接赋值,那么一定是对象的命名空间发生变化。

2.只要是静态变量,借用类名操作。


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
author-avatar
-寒小兮_991
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有