精华内容
下载资源
问答
  • python类的继承
    2020-11-30 12:19:12

    小编典典

    是否有理由要声明类声明object?

    在Python 3中,除了Python 2和3之间的兼容性之外,没有任何理由。在Python 2中,原因很多。

    Python 2.x故事:

    在Python 2.x(从2.2开始)中,有两种类型的类,取决于是否存在object作为基类的类:

    “经典”样式类:它们没有object作为基础类:

    >>> class ClassicSpam: # no base class

    ... pass

    >>> ClassicSpam.__bases__

    ()

    “新”样式类:它们具有直接或间接(例如,从内置类型继承)object作为基类:

    >>> class NewSpam(object): # directly inherit from object

    ... pass

    >>> NewSpam.__bases__

    (,)

    >>> class IntSpam(int): # indirectly inherit from object...

    ... pass

    >>> IntSpam.__bases__

    (,)

    >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object

    (,)

    毫无疑问,在编写一个类时,你总是想参加新式的类。这样做的好处很多,列举其中一些:

    支持描述符。具体来说,使用描述符可以实现以下构造:

    classmethod:一种将类作为隐式参数(而不是实例)接收的方法。

    staticmethod:一种不将隐式参数self作为第一个参数的方法。

    property以下属性:创建用于管理属性的获取,设置和删除的功能。

    The__slots__:节省了类的内存消耗,还可以更快地访问属性。当然,它确实有局限性。

    The__new__静态方法:让你自定义如何将新创建类的实例。

    方法解析顺序(MRO):尝试解析要调用的方法时,将以什么顺序搜索类的基类。

    与MRO有关,请super致电。另见,super()算超级。

    如果你不继承object,请忘记这些。可以在此处找到对以前的要点以及“新”样式类的其他特权的更为详尽的描述。

    新型类的缺点之一是,类本身对内存的要求更高。但是,除非你要创建许多类对象,否则我怀疑这将是一个问题,并且它是一个消极的消极因素。

    Python 3.x故事:

    在Python 3中,一切都得到了简化。仅存在新样式的类(统称为类),因此添加的唯一区别object是要求你再输入8个字符。这个:

    class ClassicSpam:

    pass

    完全等效(除了它们的名称:-)与此:

    class NewSpam(object):

    pass

    并为此:

    class Spam():

    pass

    所有房间都object在他们的__bases__。

    >>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]

    [True, True, True]

    那你该怎么办?

    在Python 2中: 始终从object显式继承。享受津贴。

    在Python 3中:object如果你要编写尝试与Python无关的代码,则继承自它,也就是说,它需要在Python 2和Python 3中都可以正常工作。否则,实际上并没有什么不同,因为Python会为你插入代码在幕后。

    2020-02-09

    更多相关内容
  • 这篇文章主要介绍了python类继承和多态原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就...
  • 本文实例讲述了python类继承用法。分享给大家供大家参考。具体如下: help('object') # test class Class1(object): Class1 inherits the most basic container class object (just a place holder) this is ...
  • 本文实例讲述了python类继承与子类实例初始化用法。分享给大家供大家参考。具体分析如下: [ 先贴参考书籍原文(中文英文对照)] __init__方法介绍: If a base class has an __init__() method the derived class’s...
  • python 类继承

    万次阅读 多人点赞 2018-07-19 19:04:13
    一个类继承另一个时,会自动获得另一个的所有属性和方法,被继承称之为父类,新称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法。 首先我们定义一个表示动物的父类: class ...

    一个类继承另一个类时,会自动获得另一个类的所有属性和方法,被继承的类称之为父类,新类称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法。

    首先我们定义一个表示动物的父类:

    class Animal:
        def __init__(self, animal_name, animal_type='animal'):
            self.animal_type = animal_type
            self.animal_name = animal_name
    
        def eat(self):
            print(self.animal_name + ':eat')
    
        def walk(self):
            print(self.animal_name + ':walk')
    
        def run(self):
            print(self.animal_name + ':run')
    

    我们生成一个Animal实例并且输出它的所有属性和方法:

    animal = Animal('动物','eat-animal')
    print(animal.animal_name)
    print(animal.animal_type)
    animal.eat()
    animal.walk()
    animal.run()

    运行结果:

    动物
    eat-animal
    动物:eat
    动物:walk
    动物:run

    好的,大家可以看到我们的类实例是正常的,没有任何问题。那么接下来我们就要,通过继承来创建我们的新类了。这里我们创建一个Birds类吧。

    语法:

    class Birds(Animal):
        def __init__(self,animal_name,animal_type='birds'):
            super().__init__(animal_name,animal_type)

    在python2.7中大家可能会遇到这要的写法:

    class Birds(Animal):
        def __init__(self,animal_name,animal_type='birds'):
            super(Birds,self).__init__(animal_name,animal_type)

    这和上面的区别在于super这个特殊函数必须接收两个参数,第一个是子类名,第二个是对象self。

    在创建子类的时候,首先我们的确保在当前文件中,你已经定义好了父类,而且父类定义的必须在子类前面。

    定义子类的时候,必须在括号内指定父类的名称。init 函数接收创建实例的所需参数,注意一点:这里必须包括父类init 函数的参数。你也可以添加你自己的参数:

      def __init__(self,animal_name,animal_type='birds',birds_age=10):

    这里必须调用父类的 init 函数,这样才能让子类拥有父类的所有属性。

    然后我们试着输出我们的子类:

    bird = Birds('百灵鸟')
    print(bird.animal_name)
    print(bird.animal_type)
    print(bird.birds_age)
    bird.eat()
    bird.walk()
    bird.run()

    运行结果:

    百灵鸟
    birds
    10
    百灵鸟:eat
    百灵鸟:walk
    百灵鸟:run

    我们继承父类,不会只想像上面一样这样的简单使用吧,我们当然希望能在我们的子类中增加我们需要的属性和方法。

    还是拿上面的例子来说,我们给Birds类增加一个标识有几只腿的属性和一个飞的方法。

    class Birds(Animal):
        def __init__(self,animal_name,animal_type='birds'):
            super().__init__(animal_name,animal_type)
            self.leg_count = 2
    
        def fly(self):
            print(self.animal_name + ':fly')
            print('此鸟有'+ str(self.leg_count) +'只腿')

    添加属性和方法和我们前面讲过的一样,没什么需要注意的。我们调用以下fly方法,看下能否正常输出:

    bird = Birds('百灵鸟')
    print(bird.leg_count)
    bird.fly()

    输出:

    2
    百灵鸟:fly
    此鸟有2只腿
    

    在子类中,父类的方法有可能不符合我们的期望,此时,我们需要重写父类的方法,来实现子类特性。拿Birds来说,我们希望它可以在eat方法中增加一行输出,比如我是一只吃素的鸟,显然,我们要重写eat方法:

     def eat(self):
            super().eat()
            print("我是一只吃素的鸟")
    

    然后调用一下eat方法:

    bird.eat()

    输出:

    百灵鸟:eat
    我是一只吃素的鸟

    这里大家可能看到我调用了父类的eat方法,这里我只是增加一行输出,父类的输出我们还是需要的,所以会调用。如果子类的方法和父类的逻辑不同,千万不要在调用父类的方法,自己重新实现就好。

    最后我们在来聊一下类的嵌套使用,这里的嵌套值得是将一个类作为另一个类的属性。

    让我们看下语法示例:

    class Food:
        def __init__(self):
            self.favorite_food = 'banana'
    
    
    class Person:
        def __init__(self):
            self.food = Food()
    
        def show_favorite(self):
            print("My favorite food is :" + self.food.favorite_food.title())
    
    
    person = Person();
    person.show_favorite()
    

    例子如上,很简单,首先我们定义好food类,然后将food类作为person类的属性,使用和普通的属性没有区别,只不过这个属性还可以调用自身的方法。

    输出:

    My favorite food is :Banana
    
    展开全文
  • Python类继承之虚函数

    千次阅读 2021-04-13 14:30:48
    虚函数在C++里面广泛使用,也为后面派生的一种独特类型interface奠定了编程界的基础,在python中也有类似的概念(抽象),使用如下: 抽象可以继承abc,抽象接口使用@abstractmethod以及pass来描述。 继承...

    虚函数在C++里面广泛使用,也为后面派生的一种独特类型interface奠定了编程界的基础,在python中也有类似的概念(抽象类),使用如下:

    抽象类可以继承abc,抽象接口使用@abstractmethod以及pass来描述。

    继承抽象类而没有实现抽象接口,如果实例化就会提示错误

    正常实现抽象接口,并且使用是如下这样的:

    小结以下:

    1.抽象类,要继承abc,抽象接口使用@abstractmethod以及pass

    2.继承抽象类的子类,在实例化前必须实现抽象接口,不然会提示无法实例化

    展开全文
  • python类继承(super多类继承

    千次阅读 2020-12-23 11:09:27
    1. python2和python3中定义的形式不同python3中只有只有新式class A(object): # python3中定义新式class A: # python3中定义新式(省略object)... # python2中定义经典新式和经典只要区别在继承搜索顺...

    1. python2和python3中定义类的形式不同

    python3中只有只有新式类

    class A(object): # python3中定义新式类

    class A: # python3中定义新式类(省略object)

    python2中有经典类和新式类区别:

    class A(object): # python2中定义新式类

    class A: # python2中定义经典类

    新式类和经典类只要区别在继承搜索顺序上,

    -- 经典类,搜索深度优先,先深入继承树左侧查找,然后返回,开始右侧查找

    -- 新式类,搜索广度优先,先水平查找,再向上查找

    python2-新式类:super(类, self)必须显示的申明,python3-默认自己时可省略而使用super()

    python2-新式类例子

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    super(B,self).__init__()

    class C(A):

    def __init__(self):

    print("C")

    super(C,self).__init__()

    class D(B, C):

    def __init__(self):

    print("D")

    super(D,self).__init__()

    d = D()

    print(D.mro())

    新式类——继承树查找——广度模式,D —> B —> C —> A

    >>> d = D()

    D

    B

    C

    A

    >>> print(D.mro())

    [, , , , ]

    python2经典类

    class A:

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    super(B,self).__init__()

    class C(A):

    def __init__(self):

    print("C")

    super(C,self).__init__()

    class D(B, C):

    def __init__(self):

    print("D")

    super(D,self).__init__()

    结果:经典类没有mro属性,也就不能用super(class, self)来调用

    >>> d = D()

    D

    Traceback (most recent call last):

    File "", line 1, in

    File "", line 4, in __init__

    TypeError: super() argument 1 must be type, not classobj

    >>> D.mro()

    Traceback (most recent call last):

    File "", line 1, in

    AttributeError: class D has no attribute 'mro'

    2. 类继承的两种方式

    ** 显示地调用方法:类.__init__(self)

    ** 通过 super() 调用

    2.1 单继承下,两者结果一样

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    A.__init__(self)

    b = B()

    class B(A):

    def __init__(self):

    print("B")

    super().__init__()

    b = B()

    两者方法的结果一样:

    B

    A

    B

    A

    2.2 多继承下

    显示调用方法在多继承模式下存在的问题:父类被调用不止一次

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    A.__init__(self)

    class C(A):

    def __init__(self):

    print("C")

    A.__init__(self)

    class D(B, C):

    def __init__(self):

    print("D")

    B.__init__(self)

    C.__init__(self)

    d = D()

    结果 A 类被调用了两次

    D

    B

    A

    C

    A

    使用 super() 方法,相同的类只被调用一次,python2 中使用 super(class, self).__init__(),而python3 中默认可不写,直接使用super().__init__()

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    super().__init__()

    class C(A):

    def __init__(self):

    print("C")

    super().__init__()

    class D(B, C):

    def __init__(self):

    print("D")

    super().__init__()

    d = D()

    结果如下:

    D

    B

    C

    A

    这里需要注意的一点,如果部分类使用super()方法,会出现继承不全等问题,如下:

    其中B、C类显示继承,导致结果出问题

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    A.__init__(self)

    class C(A):

    def __init__(self):

    print("C")

    A.__init__(self)

    class D(B, C):

    def __init__(self):

    print("D")

    super().__init__()

    d = D()

    结果:

    D

    B

    A

    tips: ① 不要混合使用类.__init__(self)和 super(),② 尽量使用 super()方法

    3. super调用顺序 —— mro

    3.1 查看类的继承顺序

    mro(method resolution order):表示类继承体系中的成员顺序。查看方法:类.mro()

    回到前面那个例子:

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    A.__init__(self)

    class C(A):

    def __init__(self):

    print("C")

    A.__init__(self)

    class D(B, C):

    def __init__(self):

    print("D")

    super().__init__()

    print(D.mro())

    结果表示对于D类的继承顺序为: D —> B —> C —> A,这与上述的结果相符。

    [, , , , ]

    3.2 super(cls, self)类指定,默认为当前类

    class A(object):

    def __init__(self):

    print("A")

    class B(A):

    def __init__(self):

    print("B")

    super().__init__()

    class C(A):

    def __init__(self):

    print("C")

    super().__init__()

    使用默认类此时 super().__init__() == super(D, self).__init__()

    class D(B, C):

    def __init__(self):

    print("D")

    super(D,self).__init__()

    d = D()

    print(D.mro())

    结果如下:

    D

    B

    C

    A

    [, , , , ]

    修改默认为类为B,

    class D(B, C):

    def __init__(self):

    print("D")

    super(B, self).__init__()

    d = D()

    print(D.mro())

    结果如下:发现B不见了。 为什么?

    这里super(B, self)表示:

    -- self这里指D自身,也即将D的继承顺序 [D, B, C, A, object] 传递给super()

    -- B表示从B的下一顺序开始,这里从 C —> A —> object

    -- 将第一个找到的__init__函数绑定到self对象,并返回

    D

    C

    A

    [, , , , ]

    展开全文
  • Python类继承

    千次阅读 多人点赞 2022-05-04 00:30:11
    用好继承,提高编程效率,使代码更加优雅(一起努力,咱们顶峰相见)
  • Python实现类继承实例

    2020-12-25 08:51:39
    Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例。 实例代码如下: #! /usr/bin/python # Filename: inherit.py # Author: yanggang class SchoolMember: def __...
  • python类继承

    千次阅读 2021-01-29 21:52:01
    一、概述二、继承2.1 继承的定义2.2 构造函数的继承2.3 子类对父类方法的重写三、类继承的事例一、概述面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有的所有功能...
  • 1.单继承 父类也叫基类 子类也叫派生 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): ...孙是可以继承爷爷的,如下所示: class Animal:
  • Python——继承

    千次阅读 2021-12-08 10:26:44
    Python继承语法格式如下: class 子类名(父类名): 的属性 的方法 例 7-11 继承示例,子类继承父类方法: #ex0711.py 继承示例,子类继承父类方法 class Animal: num = 0 def __init__(self): ...
  • python类继承中super的用法

    千次阅读 多人点赞 2021-11-23 10:18:22
    python中的继承与super()的使用
  • Python继承

    万次阅读 多人点赞 2022-01-08 15:14:09
    1. 单继承 继承的主要作用是实现代码的重用。继承使得子类拥有父类的方法和属性。 直接来看一个例子吧。 class animal: def eat(self): print("吃") ...从上面的代码可以看出,在编写dog的时候,我们并没有
  • 主要介绍了Python面向对象类继承和组合,结合实例形式分析了Python3面向对象继承的原理、用法以及继承与组合相关使用技巧,需要的朋友可以参考下
  • Python类继承及super()函数

    万次阅读 多人点赞 2019-06-27 19:57:36
    文章目录Python中单类继承普通方法继承初始化函数继承Python中多类继承 Python中单类继承 Python是一门面向对象的编程语言,支持类继承。新的称为子类(Subclass),被继承称为父类、基类或者超类。子类继承...
  • Python 同时继承多个

    千次阅读 2022-01-18 17:20:46
    继承两个 class A: def get(self): print("get A") class B: def get(self): print("get B") class C(A, B): def __init__(self): print("class C") c = C() c.get() 输出: F:\PyProject\test\venv\...
  • Python类继承super相关原理解析

    千次阅读 2021-02-04 09:02:34
    看了网上许多关于super、mro、C3的介绍感觉没有一份很容易初学者理解的...1、supersuper()是一种将子类与父类联系起来的一种方法,子类通过继承父类,可以使用父类的方法和属性,也可以自己定义属于自己的方法和属性...
  • python_classes_inheritance Python中的继承示例
  • python继承及初始化

    千次阅读 2022-05-03 17:09:48
    继承格式为:class 新(旧),新就可以继承的所有方法,并可以定制新的方法甚至覆盖旧的方法。 二、的初始化 初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。 初始化函数的...
  • Python类继承 在OOP(ObjectOrientedProgramming)程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、...
  • 下面小编就为大家带来一篇python面向对象_详谈继承与方法的重载。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 一、定义: class <类名>: <语句> 实例化后,可以使用其属性,实际上,创建一个之后,可以通过类名访问其属性 如果直接使用类名修改其属性,那么将直接影响到已经实例化的对象   的私有属性: __...
  • Python继承方法

    千次阅读 2020-11-16 23:15:20
    Python之间可以继承继承的叫父类或超类,新创建的叫子类。通过继承,子类可以使用父类的属性,这样可以有效减少代码的冗余度,提高代码重用性。 谈到继承,首先要了解构造函数或构造方法。 构造函数...
  • 主要介绍了python类继承用法,实例分析了Python类的定义与继承的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • python继承机制

    千次阅读 2021-11-12 16:53:51
    python支持单继承和多继承,这种继承机制极大的提高了代码的复用性,使得子类可以继承父类和祖的方法以及属性,这就是继承,同时,子类也可以重写父类和祖的某个方法或者属性,从而使得子类可以获得与父类和祖...
  • python基础进阶1.7继承,重写,多态等相关视频。至此,我认为了解这些python基础,便可以进行相关项目实践了。在实践中学习更多的python函数用法。关注微信公众号:深度学习社区DLC;博客:...
  • 我们在python继承及其实现方法中已经学会了打印子类在父类继承的属性 那么我们怎么打印出子类中特有的属性呢 普通方法 我们当然可以在子类中添加新的方法来打印,比如 class Farther(object): # 这里的object...
  • Python中的多继承跟java中的多继承不一样。Python中多继承可以继承多个基类。个人看法:Java多继承类似传统的繁殖模式(单个基类),Python符合现代的繁殖模式(基因工程,存在多个基类)。 示例: class Person: def _...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 274,757
精华内容 109,902
关键字:

python类的继承

友情链接: 14735.zip