Python高级编程学习笔记(一) 魔术方法

最近在看Luke Sneeringer的 "Professional Python" 这本书,做一些关于这本书的笔记。

首先是魔术方法,本书的第二部分,第四章。为什么不按顺序来呢,我也不知道。

0. 什么是魔术方法

简单地说,就是在面向对象编程时,编写的一些对于特定操作(例如特定函数、操作符)做出特定响应的函数(作者称之为“钩子”)。

对于魔术方法,遵循统一的格式:双下划线在函数名两端,例如常见的__init__,可以读作“dunder init”。

1. 常用的魔术方法

(1)__init__

在类的实例被创建时立即执行,必须要有参数self,没有也不能有返回值(否则会报错TypeError)。

例如:

class MyClass:
    def __init__(self):
        print("You create an object.")

cls = MyClass()

输出:

You create an object.

其实__init__更多被运用于为初始化对象赋值,但该方法并不创建对象(由__new__方法创建对象)。其作用很像C++中的构造函数。

 

(2)__new__

__new__的应用场景相对来说少一些,简单地说,其主要运用于想要继承一些不可变的自带类(如tuple、str、int等等)时,需要改写父类的__new__方法。

两个例子:

编写一个类,永远返回一个非负整数:

class PositiveInt(int):
    def __new__(cls, val):
        return super(PositiveInt, cls).__new__(cls, abs(val))

编写一个类,永远返回一个大写字母串:

class UpperStr(str):
    def __new__(cls, s):
        return super(UpperStr, cls).__new__(cls, s.upper())

此外,__new__方法还能用于实现单例(Singleton)和元类(MetaClass)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值