魔法方法
魔法方法就是面向对象的一些内置方法,在达到某个条件的时候会自动触发,不需要调用!
init
class Person :
def __init__ (self ):
print ('实例化之后触发' )
res = Person()
str
class Person :
def __init__ (self ):
print ('' )
def __str__ (self ):
print ('执行打印操作的时候触发' )
return '我必须是字符串'
res = Person()
print (res)
call
class Person :
def __call__ (self, *args, **kwargs ):
print ('对象加括号就可以触发' )
print (args)
print (kwargs)
res = Person()
res(1 , name='summer' )
getattr
class Person :
def __getattr__ (self, item ):
print ('获取不存在的属性名的时候会触发' )
print (item)
return '我是getattr'
res = Person()
print (res.name)
getattribute
class Person :
def __getattr__ (self, item ):
print ('获取不存在的属性名的时候会触发' )
print (item)
return '我是getattr'
def __getattribute__ (self, item ):
print ('获取属性的时候会触发' )
return '我是getattribute'
res = Person()
print (res.age)
setattr
class Person (object ):
def __init__ (self,name ):
self.name = name
def __setattr__ (self, key, value ):
print ('我是setattr' )
print (key)
print (value)
res = Person('summer' )
del
class Person (object ):
def __del__ (self ):
print ('我是删除功能' )
res = Person()
del res
enter 和 __exit——
class Person (object ):
def __enter__ (self ):
print ('打印我' )
return 666
def __exit__ (self, exc_type, exc_val, exc_tb ):
print ('exit' )
res = Person()
with res as f:
print (f)
魔法方法笔试题
class Context :
def __enter__ (self ):
return self
def __exit__ (self, exc_type, exc_val, exc_tb ):
pass
def do_something (self ):
pass
with Context() as f:
f.do_something()
元类
元类推导过程
l1 = [1 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
s1 = '充满元气的一天!!!冲冲冲'
d1 ={'name' :'summer' }
print (type (l1))
print (type (s1))
print (type (d1))
class P :
pass
res = P()
print (res,type (res))
print (type (P))
****由此可得出结论:元类简单点讲就是产生类的类,可以产生类也可以控制对象的参数!!
产生类的两种方式
class 类名 :
pass
------------
type (类名,类的父类,类的名称空间):
res = type ('cla' ,(),{})
print (res)
**我们学习元类是为了更好的高度定制类,就相当于我学会了怎么制造电脑,那么我就可以通过自己的需求去修改定制我想要的电脑
元类基本使用
class Myclass (type ):
pass
class Iclass (metaclass=Myclass):
pass
class Myclass (type ):
def __init__ (self, what, bases=None , dict =None ):
print (what)
print (bases)
print (dict )
if not what.istitle():
print ('首字母必须大写!!!' )
super ().__init__(what, bases, dict )
class Iclass (metaclass=Myclass):
pass
元类进阶
class Myclass (type ):
def __call__ (self, *args, **kwargs ):
print ('我是元类里的call' )
if args:
raise Exception('参数必须采用关键字形式' )
super ().__call__(*args,**kwargs)
class Yclass (metaclass=Myclass):
def __init__ (self, name, age ):
self.name = name
self.age = age
print ('我是双下call执行完以后才执行的双下init' )
res = Yclass(name = 'summer' ,age = '18' )
双下new方法
class Myclass (type ):
def __call__ (self, *args, **kwargs ):
print ('' )
obj = self.__new__(self,*args, **kwargs)
print (obj)
class Yclass (metaclass=Myclass):
def __init__ (self, name, age ):
self.name = name
self.age = age
print ('' )
res = Yclass()
反射实战案例
import settings
path = dir (settings)
d1 = {}
for i in path:
if i.isupper():
a = getattr (settings,i)
d1[i] = a
print (d1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现