秃顶之路-Day23

Day 23

1.__del__魔术方法(析构方法)lf
触发时机:当对象被内存回收的时候自动触发
第一种,页面执行完毕回收所有变量。第二种,所有的对象被del的时候
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无

class LangDog():
	food='改吃蔬菜'
	def __init__(self,name):
		self.name=name
	def __del__(self):
		print('析构方法被触发')
obj=LangDog('肉丝')
# 1.页面执行完毕回收所用变量
print(obj.name) 
# 2.所有对象被del的时候
other_obj=obj
del obj
del other_obj
# 3.模拟文件操作
import os
class ReadFile():
	def __new__(cls,filename):
		if os.path.exists(filename):
			return object.__new__(cls)
		else:
			return print('该文件是不存在的')
	def __init__(self,filename):
		self.fp=open(filename,mode='r+',encoding='utf-8')
	def readcontent(self):
		# 读取文件
		return self.fp.read()
	def __del__(self):
		# 关闭文件
		self.fp.close()
obj=ReadFile('cehai.txt')
if obj is not None:
	res=obj.readcontent()
	print(res)
else:
	print('没有该类文件')
# 三元运算符
'''真值 if 条件表达式 else 假值'''
print(obj.readcontent()) if obj is not None else print('没有该类文件')

2.str 魔术方法
触发时机:使用print(对象)或者str(对象)的时候触发
功能:查看对象
参数:一个self接受当前对象
返回值:必须返回字符串类型

class Cat():
	gift='小猫咪会卖萌'
	def __init__(self,name):
		self.name=name
	def __str__(self):
		return self.cat_info()
	def cat_info(self):
		return '小猫咪的名字是{}'.format(self.name)
	__repr__ = __str__
	tom=Cat('汤姆')
	res=str(tom)
	print(res)
	# 小扩展 让repr强转对象时,触发打印内容
	res=repr(tom)
	print(res)

3.repr 魔术方法
触发时机:使用repr(对象)的时候触发
功能:查看对象,与魔术方法__str__相似
参数:一个self接受当前对象
返回值:必须返回字符串类型

class Mouse():
	gift='偷粮食'
	def __init__(self,name):
		self.name=name
	def __repr__(self):
		return self.mouse_info()
	def mouse_info(self):
		return '名字是{},龙生龙,凤生凤,老鼠的儿子会打洞还会{}'.format(self.name,self.gift)
	# 系统在最底层,自动加了一句赋值操作
	__str__ = __repr__
jerry=Mouse(''杰瑞)
res=str(jerry)
print(res)

4.call 魔术方法
触发时机:把对象当作函数调用的时候自动触发
功能:模拟函数化操作
参数:参数不固定,至少一个self参数
返回值:看需求

# (1)基本语法
class MyClass():
	a=1
	def __call__(self):
		print('call魔术方法被触发了')
obj=MyClass()
obj()
# (2)模拟洗衣服的过程
class Wash():
	def __call__(self,something):
		print('我现在要洗{}'.format(something))
		self.step1()
		self.step2()
		self.step3()
		return '洗完了'
	def step1(self):
		print('加热水,加洗衣粉,加洗衣液') 
	def step2(self):
		print('衣服泡进去搅乱,搓一搓')
	def step3(self):
		print('脱水')
obj=Wash()
# 方法一
# obj.step1
# obj.step2
# obj.step3
# 方法二
res=obj('衣服')
print(res)
# (3)模拟内置函数int 实现相应的操作
import math
class MyTnt():
	def calc(self,num,sign=1)
		strvar=num.lstrip('0')
		if strvar == '0'
			return 0
		return eval(strvar)*sign
	def __call__(self,num):
		if isinstance(num,bool):
			if num == True:
				return 1
			else:
				return 0
		elif isinstance(num,int)
			return num
		elif isinstance(num,float)
			# 方法一
			'''
			strvar=str(num)
			lst=strvar.split('.')
			return eval(lst[0])
			'''
			# 方法二
			if num >= 0:
				return math.floor(num)
			else:
				return math.ceil(num)
			# return math.floor(num) if num >= 0 else math.ceil(num)
		elif isinstance(num,str):
			if (num[0]=='+' or num[0]=='-') and num[1:].isdecimal():
				if num[0] == '+':
					sign=1
				else:
					sign=-1
				return self.calc(num[1:],sign)
		elif num.isdecimal():
			return self.calc(num)
		else:
			return '臣妾做不到啊'
myint=MyInt()
myint('000000000000000000000000000002132132')

5.bool 魔术方法
触发时机:使用bool(对象)的时候自动触发
功能:强转对象
参数:一个self接受当前对象
返回值:必须是布尔类型
类似的方法还有如下(了解):
complex
int
float

class MyClass():
	def __bool__(self):
		return False
obj=MyClass()
res=bool(obj)
print(res)

6.add 魔术方法 (与之相关的__radd__反向加法)
触发时机:使用对象进行运算相加的时候自动触发
功能:对象运算
参数:二个对象参数
返回值:运算后的值
类似的方法还有如下:
sub(self,other)
mul(self,other)

class Myclass1():
	def __init__(self,num):
		self.num=num
	def __add__(self,other)
		return self.num + other
	def __radd__(self,other)
		return self.num*2 + other
# 第一种
a=MyClass(10)
res=a+7
print(res)
# 第二种
b=MyClass(5)
res=20+b
print(res)
# 第三种
res=a + b
print(res)
"""
23
次触发魔术方法, a+ =>触发__add__方法
self => a other => b
self.num + other => a.num+ b => 10 + b

res = 10 + b
第二次触发魔术方法 __radd__
self => b other=> 10
self.num * 2 + other => b.num*2 + other => 5 * 2 + 10 => 20
res = 20 
"""

7.len 魔术方法
触发时机:使用len(对象)的时候自定触发
功能:用于检测对象中或者类成员的个数
参数:一盒self接受当前对象
返回值:必须返回整形4
类似的还有如下:
iter
reversed
contains(self,item)

class MyClass():
	pty1=1
	pty2=2
	__pty3=3
	pty4=10
	pty=100
	def func1():
		pass
	def func2():
		pass
	def __func3():
		pass
	def __len__(self):
		lst=[]
		dic=MyClass.__dic__
		lst=[i for i in dic if not (i.starswish('__' and i.endswish('__'))]
		return len(lst)
obj=MyClass()
print(len(obj))
"""
{
'__module__': '__main__', 
'pty1': 1, 
'pty2': 2, 
'_MyClass__pty3': 3, 
'func1': <function MyClass.func1 at 0x7fc198171378>, 
'func2': <function MyClass.func2 at 0x7fc198171400>, 
'_MyClass__func3': <function MyClass.__func3 at 0x7fc198171488>, 
'__len__': <function MyClass.__len__ at 0x7fc198171510>, 
'__dict__': <attribute '__dict__' of 'MyClass' objects>, 
'__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'__doc__': None
}
"""

8.与类相关的魔术属性

class Man():
	pass
class Women():
	pass
class Children(Man,Woman):
	'''
	功能:描述小孩的天生属性
	成员属性:eye  skin
	成员方法:skylight moonread  __makebaby
	'''
	eye='血轮眼'
	skin='白色'
	def skylight(self):
		print('宇智波家族的小孩,天生能够发动天照技能')
	def moonread(self):
		print('宇智波家族的小孩,能够发动月亮的关照消灭你')
		res=func.__name__
		print(res,type(res))
	def __makebaby(self):
		print('这一招,只能我自己能用')
# __dict__获取对象或类的内部成员结构
obj=Children()
print(obj.__dict_)
print(Children.__dict__)
# __doc__获取对象或类的内部文档
print(obj.__doc__)
print(Children.__doc__)
# __name__获取类名函数名
def func111():
	print('我是func111方法')
# 获取函数名
obj.moodread(func111)
# 获取类名
obj.moodread(Man)
# __class__获取当前对象所属的类
print(obj.__class__)
# __bases__获取一个类直接继承的所有父类,返回元组
print(Children.__base__)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值