《小甲鱼零基础入门学习Python》自学笔记(六)—— 魔法方法

魔法方法

一、Python 魔法方法详解

https://fishc.com.cn/forum.php?mod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403

二、构造和析构

  • 魔法方法总是被双下划线包围,例如:__init__方法
  • 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大
  • 魔法方法的"魔力"体现在它们总能够在适当的时候被自动调用

(1)__init__(self[, ...])
在需要对对象进行初始化操作时,才会用到。
必须return None
不能另加return,会报错!

(2)__new__(cls[, ...])
实例化对象时,第一个被调用的方法。
默认执行,一般不需要重写。
需要重写的情况:当继承一个不可变类型,又需要修改的时候,那么它的特性就显得尤为重要。

eg:
>>> class CapStr(str):
	def __new__(cls, string):
		string = string.upper()
		return str.__new__(cls, string)

	
>>> a = CapStr('Love')
>>> a
'LOVE'

这里的CapStr是要继承str,但是CapStr又要把输入的字符串变成大写,str没有这个性质,它是不能改变的,类CapStr就成了继承str且能把输入变大写的类

(3)__del__(self)
析构器。
当对象将要被销毁的时候,这个方法就会被调用。
并非del x就相当于自动调用x.__del__()__del__方法是当垃圾回收机制回收这个对象的时候调用的。
eg:

>>> class C:
	def __init__(self):
		print('我是__init__方法,我被调用了!')
	def __del__(self):
		print('我是__del__方法,我被调用了!')

		
>>> c1 = C()
我是__init__方法,我被调用了!
>>> c2 = c1
>>> c3 = c2
>>> del c3
>>> del c2
>>> del c1
我是__del__方法,我被调用了!

要删除所有的实例化对象时,才会被调用__del__方法。

三、算术运算

算数运算符
https://fishc.com.cn/forum.php?mod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403

反运算
https://fishc.com.cn/forum.php?mod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403

eg:

>>> class Nint(int):
	def __rsub__(self, other):
		return int.__sub__(self, other)

	
>>> a = Nint(5)
>>> 2 - a
3

当执行反运算时,aself2other。所以2 - a其实是5-2,结果为3。

四、属性访问

  • __getattr__(self, name)

定义当用户试图获取一个不存在的属性时的行为

  • __getattribute__(self, name)

定义当该类的属性被访问时的行为

  • __setattr__(self, name, value)

定义当一个属性被设置时的行为

  • __delattr__(self, name)

定义当一个属性被删除时的行为

eg:
写一个矩形类,默认有宽和高两个属性;如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。

class Rectangle:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height

    def __setattr__(self, name, value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            super().__setattr__(name, value)

    def getArea(self):
        return self.width * self.height

运行:

>>> r = Rectangle(4, 5)
>>> r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值