返回顶部
首页 > 资讯 > 后端开发 > Python >怎么在Python中实现类的单继承
  • 642
分享到

怎么在Python中实现类的单继承

2023-06-15 01:06:45 642人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

怎么在python中实现类的单继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、类的继承面向对象三要素之一,继承Inheritance人类和猫类都继承自动物类。个体继承自父

怎么在python中实现类的单继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、类的继承

面向对象三要素之一,继承Inheritance

人类和猫类都继承自动物类。

个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性。

在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样就可以减少代码、多服用。子类可以定义自己的属性和方法

class Animal:     def __init__(self,name):        self._name = name     def shout(self):        print("{}  shouts".fORMat(self.__class__.__name__))    @property    def name(self):        return self._name  class Cat(Animal):    pass  class Dog(Animal):    pass a = Animal("monster")a.shout()           #   Animal  shouts  cat = Cat("garfield")cat.shout()         #   Cat  shoutsprint(cat.name)     #   garfield  dog = Dog("ahuang")dog.shout()         #   Dog  shoutsprint(dog.name)     #   ahuang

上例中我们可以看出,通过继承、猫类、狗类不用写代码,直接继承了父类的属性和方法

继承:

  • class Cat(Animal)这种形式就是从父类继承,括号中写上继承的类的列表。

  • 继承可以让子类重父类获取特征(属性、方法)

父类:

  • Animal就是Cat的父类,也称为基类、超类

子类:

  • Cat 就是Animal的子类,也成为派生类  

二、继承的定义、查看继承的特殊属性和方法

格式

class 子类 (基类1[,基类2,……]):    语句块

如果类定义时,没有基类列表,等同于继承自【object】。在python3中,【object】类是所有对象基类

查看继承的特殊属性和方法

特殊属性 含义示例
__base__ 类的基类 

__bases__ 类的基类元组 
__mro__ 显示方法查找顺序,基类的元组 
mro() 同上 int.mro()
__subclasses__() 类的子类列表 int.__subclasses__()

三、继承中的访问控制

class Animal:    __COUNT = 100    HEIGHT = 0     def __init__(self,age,weight,height):        self.__COUNT += 1        self.age = age        self.__weight = weight        self.HEIGHT = height     def eat(self):        print("{}  eat".format(self.__class__.__name__))     def __getweight(self):        print(self.__weight)     @claSSMethod    def showcount1(cls):        print(cls.__COUNT)     @classmethod    def __showcount2(cls):        print(cls.__COUNT)     def showcount3(self):        print(self.__COUNT) class Cat(Animal):    NAME = "CAT"    __COUNT = 200 #a = Cat()              #   TypeError: __init__() missing 3 required positional arguments: 'age', 'weight', and 'height'a = Cat(30,50,15)a.eat()                 #   Cat  eatprint(a.HEIGHT)         #   15#print(a.__COUNT)        #   AttributeError: 'Cat' object has no attribute '__COUNT'#print(a.__showcount2)   #   AttributeError: 'Cat' object has no attribute '__showcount2'#print(a.__getweight)    #   AttributeError: 'Cat' object has no attribute '__getweight'a.showcount3()   #   101a.showcount1()   #  100print(a.NAME)    #    CAT print(Animal.__dict__)  #   {'__module__': '__main__', '_Animal__COUNT': 100, 'HEIGHT': 0, '__init__': <function Animal.__init__ at 0x020DC228>, 'eat': <function Animal.eat at 0x020DC468>, '_Animal__getweight': <function Animal.__getweight at 0x02126150>, 'showcount1': <classmethod object at 0x020E1BD0>, '_Animal__showcount2': <classmethod object at 0x020E1890>, 'showcount3': <function Animal.showcount3 at 0x021264F8>, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__doc__': None}print(Cat.__dict__)     #   {'__module__': '__main__', 'NAME': 'CAT', '_Cat__COUNT': 200, '__doc__': None}print(a.__dict__)       #   {'_Animal__COUNT': 101, 'age': 30, '_Animal__weight': 50, 'HEIGHT': 15}

从父类继承、自己没有的,就可以到父类中找

私有的都是不可访问的,但是本质上依然是改了名称放在这个属性所在的类的了【__dict__】中,知道这个新民成就可以了直接找到这个隐藏的变量,这是个黑魔法慎用

总结

  • 继承时,共有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不可直接访问,当私有变量所在类内方法中可以访问这个私有变量

  • Python通过自己一套实现,实现和其他语言一样的面向对象的继承机制

属性查找顺序:实例的【__dict__】------类的【__dict__】-----父类【__dict__】

如果搜索这些地方后没有找到异常,先找到就立即返回

四、方法的重写、覆盖override

class Animal:     def shout(self):        print("Animal shouts") class Cat(Animal):     def shout(self):        print("miao") a = Animal()a.shout()       #   Animal shoutsb  = Cat()b.shout()       #   miao print(a.__dict__)       #   {}print(b.__dict__)       #   {}print(Animal.__dict__)  #   {'__module__': '__main__', 'shout': <function Animal.shout at 0x017BC228>, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__doc__': None}

Cat类中shout为什么没有打印Animal中shout的方法,方法被覆盖了?

  • 这是因为,属性查找顺序:实例的【__dict__】------类的【__dict__】-----父类【__dict__】

那子类如何打印父类的同命的方法

  • super()可以访问到父类的属性

class Animal:     def shout(self):        print("Animal shouts") class Cat(Animal):     def shout(self):        print("miao")     def shout(self):        print("super():   " , super())        print(super(Cat, self))        super().shout()        super(Cat,self).shout()   # 等价于super().shout()        self.__class__.__base__.shout(self)  #不推荐使用 a = Animal()a.shout()       #   Animal shoutsb  = Cat()b.shout()       #   super():    <super: <class 'Cat'>, <Cat object>>                #   <super: <class 'Cat'>, <Cat object>>                #   Animal shouts                #   Animal shouts                #   Animal shoutsprint(a.__dict__)       #   {}print(b.__dict__)       #   {}print(Animal.__dict__)  #   {'__module__': '__main__', 'shout': <function Animal.shout at 0x019AC228>, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__doc__': None}print(Cat.__dict__)     #   {'__module__': '__main__', 'shout': <function Cat.shout at 0x019F6150>, '__doc__': None}

super(Cat,self).shout()的作用相当于

  • 调用,当前b的实例中找cat类基类中,shout的方法

那对于类方法和静态方法是否也同样适用尼?

class Animal:    @classmethod    def class_method(cls):        print("class_method")     @staticmethod    def static_method():        print("static_methond_animal") class Cat(Animal):    @classmethod    def class_method(cls):        super().class_method()  #   class_method        print("class_method_cat")     @staticmethod    def static_method(cls,self):        super(Cat,self).static_method()        print("static_method_cat") b = Cat()b.class_method()    #   class_method                    #   class_method_catb.static_method(Cat,b)                    #   static_methond_animal                    #   static_method_cat

这些方法都可以覆盖,原理都一样,属性字典的搜索顺序

五、继承中的初始化

看以下一段代码,有没有问题

class A:    def __init__(self,a):        self.a = a class B(A):    def __init__(self,b,c):        self.b = b        self.c = c     def printv(self):        print(self.b)        print(self.a) a = B(100,300)print(a.__dict__)       #   {'b': 100, 'c': 300}print(a.__class__.__bases__)    #   (<class '__main__.A'>,)a.printv()      #   100                #   AttributeError: 'B' object has no attribute 'a'

上例代码

  • 如果B类定义时声明继承自类A,则在B类中__bases__中是可以看到类A

  • 这和是否调用类A的构造方法是两回事

  • 如果B中调用了A的构造方法,就可以拥有父类的属性了,如果理解这一句话?

class A:    def __init__(self,a):        self.a = a class B(A):    def __init__(self,b,c):        super().__init__(b+c)        # A.__init__(self,b+c)        self.b = b        self.c = c     def printv(self):        print(self.b)        print(self.a) a = B(100,300)print(a.__dict__)       #   {'a': 400, 'b': 100, 'c': 300}print(a.__class__.__bases__)    #   (<class '__main__.A'>,)a.printv()      #   100                #   400

作为好的习惯,如果父类定义了__init__方法,你就改在子类__init__中调用它【建议适用super()方法调用】

那子类什么时候自动调用父类的【__init__】方法?

例子一:【B实例的初始化会自动调用基类A的__init__方法】

class A:    def __init__(self):        self.a1 = "a1"        self.__a2 = "a2"        print("A init") class B(A):    pass b = B()     #   A initprint(b.__dict__)   #   {'a1': 'a1', '_A__a2': 'a2'}

例子二:【B实例的初始化__init__方法不会自动调用父类的初始化__init__方法,需要手动调用】

class A:    def __init__(self):        self.a1 = "a1"        self.__a2 = "a2"        print("A init") class B(A):    def __init__(self):        self.b1 = "b1"        self.__b2 = "b2"        print("b init")        #A.__init__(self) b = B()     #   b initprint(b.__dict__)   #   {'b1': 'b1', '_B__b2': 'b2'}

那如何正确实例化?

  • 注意,调用父类的__init__方法,出现在不同的位置,可能导致出现不同的结果

class Animal:    def __init__(self,age):        print("Animal init")        self.age = age     def show(self):        print(self.age) class Cat(Animal):    def __init__(self,age,weight):        #调用父类的__init__方法的顺序 决定show方法的结果        super(Cat, self).__init__(age)        print("Cat init")        self.age = age + 1        self.weight = weight a = Cat(10,5)a.show()        #   Animal init                #   Cat init                #   11

怎么直接将上例中所有的实例属性改变为私有属性?

  • 解决办法,一个原则,自己的私有属性,就该自己的方法读取和修改,不要借助其他类的方法,即父类或者派生类

class Animal:    def __init__(self,age):        print("Animal init")        self.__age = age     def show(self):        print(self.__age) class Cat(Animal):    def __init__(self,age,weight):        #调用父类的__init__方法的顺序 决定show方法的结果        super(Cat, self).__init__(age)        print("Cat init")        self.__age = age + 1        self.__weight = weight     def show(self):        print(self.__age) a = Cat(10,5)a.show()        #   Animal init                #   Cat init                #   11print(a.__dict__)   #   {'_Animal__age': 10, '_Cat__age': 11, '_Cat__weight': 5}

python有哪些常用库

python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

看完上述内容,你们掌握怎么在Python中实现类的单继承的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网Python频道,感谢各位的阅读!

--结束END--

本文标题: 怎么在Python中实现类的单继承

本文链接: https://lsjlt.com/news/276505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在Python中实现类的单继承
    怎么在Python中实现类的单继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、类的继承面向对象三要素之一,继承Inheritance人类和猫类都继承自动物类。个体继承自父...
    99+
    2023-06-15
  • Python中类的继承怎么实现
    本篇内容主要讲解“Python中类的继承怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中类的继承怎么实现”吧!1. 单继承继承的主要作用是实现代码的重用。继承使得子类拥有父类...
    99+
    2023-07-02
  • 怎么在python中实现继承的多种类型
    本篇文章给大家分享的是有关怎么在python中实现继承的多种类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、类型说明(1)单一继承单级继承使派生类能够从单个父类继承特征。...
    99+
    2023-06-15
  • 如何在Python中实现类的继承
    如何在Python中实现类的继承?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、继承的格式类的继承格式如下,括号中的为父类名。class 类名(父类名): ...
    99+
    2023-06-15
  • 怎么在python中定义单继承和多继承
    本篇文章为大家展示了怎么在python中定义单继承和多继承,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、lon...
    99+
    2023-06-14
  • Python类中的单继承和多继承用法
    本篇内容主要讲解“Python类中的单继承和多继承用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python类中的单继承和多继承用法”吧!前言Python面向对象编程语言,有List、Str...
    99+
    2023-06-02
  • php中怎么实现类继承和接口继承
    这篇文章将为大家详细讲解有关php中怎么实现类继承和接口继承,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、PHP类不支持多继承,也就是子类只能继承一个父...
    99+
    2024-04-02
  • 怎么在python中定义类的继承
    怎么在python中定义类的继承?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pytho...
    99+
    2023-06-14
  • 怎么在python中重写继承类
    这篇文章给大家介绍怎么在python中重写继承类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点...
    99+
    2023-06-14
  • es6类的继承怎么实现
    在ES6中,可以使用`extends`关键字来实现类的继承。继承可以实现一个类继承另一个类的属性和方法。下面是一个示例代码:```j...
    99+
    2023-10-09
    es6
  • java怎么实现类的继承
    在Java中,使用关键字`extends`来实现类的继承。继承允许一个类继承另一个类的属性和方法。下面是一个示例代码,演示了如何实现...
    99+
    2023-08-08
    java
  • 如何在JavaScript中实现简单的继承
    这篇文章主要讲解了“如何在JavaScript中实现简单的继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在JavaScript中实现简单的继承”吧!...
    99+
    2024-04-02
  • python中子类如何实现继承父类
    python中子类如何实现继承父类?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。类型1:父类和子类的实例变量均不需要传递class A(object)...
    99+
    2023-06-08
  • python怎么实现多继承
    在Python中,实现多继承可以通过使用逗号分隔的多个父类来定义一个类。详细介绍:当一个类继承多个父类时,将继承所有父类的属性和方法。这意味着子类可以访问和使用父类中定义的属性和方法。本教程操作系统:windows10系统、Python3....
    99+
    2023-12-11
    多继承 python
  • python子类在多继承中怎么使用MRO
    本篇内容主要讲解“python子类在多继承中怎么使用MRO”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python子类在多继承中怎么使用MRO”吧!子类在多继承中使用MRO机制在Python中...
    99+
    2023-07-05
  • 怎么理解Python类的继承
    这篇文章主要讲解了“怎么理解Python类的继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Python类的继承”吧!1、对继承的理解继承(Inheritance) :代码复用的高...
    99+
    2023-06-25
  • python类的继承怎么定义
    这篇文章主要介绍“python类的继承怎么定义”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python类的继承怎么定义”文章能帮助大家解决问题。说明基于一个现有的类来获得它所有的能力,并以此来扩展...
    99+
    2023-06-30
  • php继承多个类怎么实现
    在PHP中,一个类只能继承一个父类,但可以实现多个接口。如果需要实现多个类的功能,可以使用接口来实现。例如,我们有两个类A和B,我们...
    99+
    2023-10-18
    php
  • C#中的继承怎么实现
    在C#中,继承是通过使用关键字" : "来实现的。下面是一个简单的示例,演示了如何在C#中实现继承: // 定义...
    99+
    2024-03-06
    C#
  • C++继承与虚继承怎么实现
    这篇文章主要介绍“C++继承与虚继承怎么实现”,在日常操作中,相信很多人在C++继承与虚继承怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++继承与虚继承怎么实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作