Python 训练 Day 13-14

本文深入讲解了Python中的魔法方法,包括构造与解析方法如__init__和__new__,垃圾回收方法__del__,以及如何通过__str__和__repr__自定义对象的字符串表示。此外,还探讨了属性访问、描述符、容器协议等高级主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 训练 Day 13-14 魔法方法

静水流深 2019.11.04

魔法方法

魔法方法总是被双下划线包围。魔法方法是python的一切。魔法方法总是在适当的时候被自动调用。

构造与解析

__ init __(self [ , …] )

class Rectangle:
    def __init__(self,x,y):
       self.x = x
       self.y = y
    def getPeri(self):
       return (self.x+self.y)*2
    def getArea(self):
       return self.x*self.y
rect = Rectangle(3,4)
rect.getPeri()#14
rect.getArea()#12

注意 init 不能返回值!!

__ new __(cls [ , …] )
第一个被调用的方法是 new 方法。new 后面不是self,而是class,它返回一个class实例对象。如果new后面有参数,参数会被原封不动的传递给 init 方法。
我们平时不太使用new方法,但是当我们继承并需要修改一个不可变类的时候。

class Capstr(str)
	def __new__(cls,string):
        	string=string.upper()
        	return string.__new__(cls,string)
a = Capstr('abc')
a#ABC

__del __(self)

首先注意 del x != x.del()。这是垃圾回收机制。

class A :
	def __init__(self):
		print("init被调用")
	def __del__(self): 
		print("del被调用")
a1 = A()#init被调用
a2 = a1
a3 = a2
del a3
del a2
del a1#del被调用

del(self) 被调用不是因为发生del操作就被引用,而是对象生成之后,所有对他的引用都被del之后才会启用垃圾回收机制,就会自动清理。

工厂函数

在这里插入图片描述举例子

class New_int(int):
	def __add__(self,other):
		return int.__sub__(self.other)
	def __sub__(self.other):
		return int.__add__(self,other)
a = New_int(3)
b = New_int(5)
a + b #-2

__ str __ 和 __ repr __
__ str__

class A ():
	def __str__():
		return "Hh"
a = A()
print(a)#Hh

__ repr __

class B ():
	def __repr__():
		return "Hh"
b = B()
b#Hh
属性访问

property可以以属性的形式访问属性。

class A :
	def __init__(self,size=10):
		self.size = size
	def getSize(self):
		return self.size
	def setSize(self,value):
		self.size = value
	def delSize(self):
		del self.size
	x = property(getSize,setSize,delSize)
a = A()
a.x = 1
a.size#1

__ getattr __(self,name)定义当用户试图获取一个不存在的属性时的行为
__ getattribute __(self,name)定义当该类的属性被访问时候的行为
__ setattr __ (self,name,value)定义当一个属性被设置时的行为
__ delseer __(self,name)定义当一个属性被删除时的行为

顺序
class A :
	def __getattribute__(self,name):
		print('getattribute')
		return super.__getattribute__(name)
	def __getattr__(self,name):
		print('getattr')
	def __setattr__ (self,name,value):
		print('setattr')
		super().__setattr__ (self,name,value)
	def __delattr__ (self,name):
		print('delattr')
		return super.__delattr__(name)
a = A()
a.x #getattribute
    #getattr

也就是说getattribute先于getattr

描述符

描述符就是将某种特殊类型的类的实例指派给另一个类的属性
__ get __(self,instance,owner) 用于访问属性,返回属性的值。
__ set __(self,instance,value) 将在属性分配操纵中调用,不返回任何内容。
__ delete __(self,instance) 控制删除操作,不返回任何内容。
在这里插入图片描述

容器

协议类似于C++中的接口,但是在python,协议更像是指南。
定制容器类型的协议
不可变容器,只需要定义__ len ()和 getitem ()方法。
可变容器,除了定义
len ()和 getitem ()方法,还要定义 setitem ()和 delitem __()方法。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值