王振2020-5-29笔记

######   __del__ 魔术方法(析构方法)
'''
触发时机:当对象被内存回收的时候自动触发
[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
'''
1.页面执行完毕回收所有变量,触发析构方法
class Langgou():
	food = "吃肉"
	def __init__(self,name):
		self.name = name
		
	def __del__(self):
		print("析构方法被触发")
obj = Langgou("刀疤")
print(obj.name)

2.所有对象被del的时候,触发析构方法
del obj
del other_obj

### 模拟文件操作
import os
class Read():
	def __new__(cls,name):
		if os.path.exists(name):
			return object.__new__(cls)
		else:
			return print("该文件不存在")
	
	def __init__(self,name):
		self.fp = open(name,mode="r",encoding="utf-8")
	
	def readcontent(self):
		content = self.fp.read()
		return content
	
	def __del__(self):
		self.fp.close()
	
	
obj = Read("wangzhen.txt")
obj.readcontent()

<------------------------------------------------------------------>
#####  __str__ 魔术方法
'''
	触发时机: 使用print(对象)或者str(对象)的时候触发
	功能:     查看对象
	参数:     一个self接受当前对象
	返回值:   必须返回字符串类型
'''
class Cat():
	gift = "九条命"
	
	def __init__(self,name):
		self.name = name
	def __str__(self):
		return self.cat()
	def cat(self):
		return "{}小猫有故事{}".format(self.name,self.gift)
		
tom = Cat("汤姆")
# 打印对象的时候触发
print(tom)

# 用str强转的时候触发
res = str(tom)
print(res)

<------------------------------------------------------------------------>
####   __repr__ 魔术方法
'''
	触发时机: 使用repr(对象)的时候触发
	功能:     查看对象,与魔术方法__str__相似
	参数:     一个self接受当前对象
	返回值:   必须返回字符串类型
'''
class Mouse():
	gift = "打洞"
	
	def __init__(self,name):
		self.name = name
		
	def __repr__(self):
		return self.mouse()
		
	def mouse(self):
		return "{}老鼠有故事{}".format(self.name,self.gift)
		
obj = Mouse("杰瑞")
# 被强转的时候触发
print(repr(obj))

<------------------------------------------------------------------>
####  __call__ 魔术方法
'''
	触发时机:把对象当作函数调用的时候自动触发
	功能: 模拟函数化操作
	参数: 参数不固定,至少一个self参数
	返回值: 看需求
'''
# (1)基本用法
class Mouse():
	def __call__(self):
		print("王振")

obj = Mouse()
obj()
对象当函数调用

可以用call方法实现模拟系统内置方法(重点)

<----------------------------------------------------------------------------->
####   __bool__ 魔术方法
'''
	触发时机:使用bool(对象)的时候自动触发
	功能:强转对象
	参数:一个self接受当前对象
	返回值:必须是布尔类型
'''
class Mouse():
	def __bool__(self):
		return False

obj = Mouse()
res = bool(obj)
print(res)

类似的还有如下等等(了解):
	__complex__(self)complex强转对象时调用
	__int__(self)int强转对象时调用
	__float__(self)float强转对象时调用

<------------------------------------------------------------------>
###   __add__ 魔术方法  (与之相关的__radd__ 反向加法)
'''
	触发时机:使用对象进行运算相加的时候自动触发
	功能:对象运算
	参数:二个对象参数
	返回值:运算后的值
'''
class Mouse():
	def __init__(self,num):
		self.num = num
	
	# 对象在加号左侧,自动触发
	def __add__(self,other):
		return self.num + other
	
	
a = Mouse(7)
res = a + 7
print(res)

两个对象相加的时候,会两次触发add方法第一次是add,第二次是radd

'''
类似的还有如下等等(了解):
	__sub__(self, other)           定义减法的行为:-
	__mul__(self, other)           定义乘法的行为:
	__truediv__(self, other)       定义真除法的行为:/
	
'''

<---------------------------------------------------------------------->
####   __len__ 魔术方法
'''
	触发时机:使用len(对象)的时候自动触发 
	功能:用于检测对象中或者类中某个内容的个数
	参数:一个self接受当前对象
	返回值:必须返回整型
'''
class Myclass():
	pty = 1
	pty2 = 2
	def __len__(self):
	lst = [i for i in MyClass.__dict__ if not(  i.startswith("__") and i.endswith("__")  )]
	return len(lst)
		
obj = Myclass()
print(len(obj))


'''
类似的还有如下等等(了解):
	__iter__(self)                 定义迭代容器中的元素的行为
	__reversed__(self)             定义当被 reversed() 调用时的行为
	__contains__(self, item)       定义当使用成员测试运算符(in 或 not in)时的行为
	...
	...
''' 

<-------------------------------------------------------------------->
#### 魔术属性

# __dict__ 获取对象或类的内部成员结构
print(obj.__dict__)
print(Children.__dict__)

# __doc__  获取对象或类的内部文档
print(obj.__doc__)
print(Children.__doc__)

# __name__  获取类名函数名
def earth_boom(self,func):
	print(func.__name__ , type(  func.__name__  ))

# __class__ 获取当前对象所属的类
print(obj.__class__)

# __bases__ 获取一个类直接继承的所有父类,返回元组
print(Children.__bases__) 




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值