python 经典类和新式类

本文深入探讨了Python中的类继承机制,包括经典类与新式类的区别,如何使用super()调用父类方法,以及子类如何重写父类的属性和方法。通过具体示例,展示了单继承和多继承下属性和方法的调用顺序。
#4.经典类和新式类
#4.1 经典类 :
# class 类名:
#     code....
#     .....

#4.2 新式类 :
# class 类名(object):
#     code...
#     code...
# 以后全部用新式类
# 在Python中,所有类默认继承object类,object类是顶级类或者说基类,其他子类叫派生类
#父类
class Father():
    def __init__(self):
        self.hair = '卷发'
        self.address = '湖北'

    def print_info(self):
        print(f"hair = {self.hair}")
        print(f"address = {self.address}")

    def __str__(self):
        return 'This is Father class'
#父类2(多继承)
class Mother():
    def __init__(self):
        self.hair = '直发'
        self.address = '湖南'

    def print_info(self):
        print(f"hair = {self.hair}")
        print(f"address = {self.address}")

    def __str__(self):
        return 'This is Mother class'
#子类
class Son(Father, Mother):
    def __init__(self):
        self.hair = '卷发'
        self.address = '广东'

    def print_info(self):
        print(f"hair = {self.hair}")
        print(f"address = {self.address}")
        # super(Father, self).__init__()
        # super(Father, self).print_info()
        # super(Mother, self).__init__()
        # super(Mother, self).print_info()

    def __str__(self):
        return 'This is Son class'

    # 子类调用父类的同名属性和方法 : 把父类的同名属性和方法再封装一次
    def father_print_info(self):
        # #方式一 : 这里一定要先初始化一次父类的同名属性和方法
        Father.__init__(self) #这里要传参数 self
        Father.print_info(self) #这里要传参数 self

    def mother_print_info(self):
        Mother.__init__(self)
        Mother.print_info(self)

class GrandSon(Son):
    def __init__(self):
        self.hair = '短发'
        self.address = '深圳'

    def print_info(self):
        print(f"hair = {self.hair}")
        print(f"address = {self.address}")



son = Son()
son.print_info()
# son.father_print_info()
# print(son)

#结论 : 如果一个类继承多个父类, 优先继承第一个类的同名属性和方法
# 子类重写了和父类相同的属性或方法时,调用的是子类的属性或方法

#类名.__mro__可以查看该类的继承关系
#print(Son.__mro__)
#输出 (<+class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class 'object'>)
#print(type(Son.__mro__))#输出 <class 'tuple'>

 

### Python 新式经典的区别 #### 型定义差异 在 Python 2 中,如果一个未显式继承 `object`,它会被视为经典;反之,则为新式。而在 Python 3 中,所有默认继承自 `object`,因此不存在经典的概念[^1]。 #### 方法解析顺序 (MRO) 新式采用 C3 线性化算法来决定方法解析顺序 (Method Resolution Order),这种方法确保每个父只被访问一次,并维持正确的继承层次结构。相比之下,经典使用深度优先搜索的方式解析方法,可能导致复杂多重继承场景下的不可预期行为[^5]。 #### 构造函数机制 对于新式而言,存在两个重要的特殊方法:`__new__` `__init__`。其中 `__new__` 是用于创建实例的静态方法,而 `__init__` 负责初始化已创建的对象。这一区分赋予了开发者更大的灵活性。然而,在经典中仅提供 `__init__` 方法而不支持 `__new__`[^5]。 #### 内置属性与方法增强 新式引入了一些有用的内置特性,例如可以通过设置 `__slots__` 来限制对象能够动态添加哪些属性,以及利用 `super()` 函数简化对父方法的调用过程。这些功能在经典里要么缺失要么不够完善[^5]。 #### 使用场景分析 由于上述优势所在,在现代编程实践中几乎总是建议选用新式而非经典。特别是在涉及多重继承、需要精确控制对象生命周期或者希望充分利用 Python 提供的各种高级 OOP 特性的场合下更是如此。需要注意的是,随着 Python 3 成为主流版本号之后,讨论经典的实际意义已经大大降低,因为后者完全被淘汰掉了[^4]。 ```python class NewStyleClass(object): """A new-style class example.""" def __init__(self, value): self.value = value def show_value(self): print(f"The value is {self.value}") # In Python 3+, all classes are implicitly new-style. class ImplicitNewStyleClass: pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值