python基础(魔法方法(构造、析构函数)、重写继承父类的方法、super函数)

本文详细介绍了Python中的魔法方法,包括构造函数`__init__`、析构函数`__del__`以及如何重写继承自父类的方法。特别是强调了在重写构造函数时调用超类构造函数的重要性,推荐使用`super()`函数来实现,以避免初始化问题。同时,文章探讨了`super()`函数的优势,即使在复杂的继承结构中也能优雅地处理方法调用。
摘要由CSDN通过智能技术生成

1.魔法方法

在Python中,有些名称很特别,开头和结尾都是两个下划线。如__future__。这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称。在这样的名称中,很大一部分都是魔法(特殊)方法的名称。如果你的对象实现了这些方法,它们将在特定情况下(具体是哪种情况取决于方法的名称)被Python调用,而几乎不需要直接调用。
这里讨论几个重要的魔法方法,其中最重要的是__init__以及一些处理元素访问的方法(它们让你能够创建序列或映射)。

如果你使用的不是 Python 3 
在Python 2.2中,Python对象的工作方式有了很大的变化。这种变化带来了多个方面的影响。
这些影响对Python编程新手来说大都不重要,但有一点需要注意:即便你使用的是较新的Python 2版本,有些功能(如特性和函数super)也不适用于旧式类。要让你的类是新式的,要么在模块开头包含赋值语句__metaclass__ = type,要么直接或间接地继承内置类object或其他新式类。请看下面两个类:
class NewStyle(object): 
    more_code_here 
class OldStyle: 
    more_code_here 
在这两个类中,NewStyle是一个新式类,而OldStyle是一个旧式类。如果文件开头包含赋值语句__metaclass__ = type,这两个类都将是新式类。

也可在类的作用域内给变量__metaclass__赋值,但这样做只设置当前类的元类(metaclass)。元类是其他类所属的类,这是一个非常复杂的主题。

我并没有在所有示例中都显式地设置元类或继承object。然而,如果你的程序无需与旧版Python兼容,建议将所有类都定义为新式类。
请注意,在Python 3中没有旧式类,因此无需显式地继承object或将__metaclass__设置为type。所有的类都将隐式地继承object。如果没有指定超类,将直接继承它,否则将间接地继承它。

 

2.构造函数、析构函数
要介绍的第一个魔法方法是构造函数。你可能从未听说过构造函数(constructor),它其实就是一些示例中使用的初始化方法,只是命名为__init__。然而,构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们。因此,无需采用一直使用的做法:
>>> f = FooBar() 
>>> f.init() 
构造函数让你只需像下面这样做:
>>>

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,子类可以继承父类构造函数。有几种方法可以实现这一点。 第一种方法是不重写父类的`__init__`方法。当子类实例化时,会自动调用父类定义的`__init__`方法。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` name: runoob Son runoob ``` 第二种方法重写子类的`__init__`方法。当子类实例化时,不会调用父类已经定义的`__init__`方法。可以在子类的`__init__`方法中添加自己的逻辑。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): print("hi") self.name = name def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` hi Son runoob ``` 第三种方法是在子类的`__init__`方法中调用父类构造方法,可以使用`super`关键字或父类名称来实现。例如: ```python class Father(object): def __init__(self, name): self.name = name print("name: %s" % (self.name)) def getName(self): return 'Father ' + self.name class Son(Father): def __init__(self, name): super(Son, self).__init__(name) print("hi") self.name = name def getName(self): return 'Son ' + self.name if __name__ == '__main__': son = Son('runoob') print(son.getName()) ``` 输出结果为: ``` name: runoob hi Son runoob ``` 以上是三种常见的继承父类构造函数方法。具体使用哪种方法取决于你的需求和设计。 #### 引用[.reference_title] - *1* *2* *3* [python子类继承父类构造函数](https://blog.csdn.net/ningjie420/article/details/108676985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值