面向对象的魔法方法
class C1 :
name = '张三丰'
age = 18
def __init__ ( self, name) :
print ( '__init__' )
def __str__ ( self) :
print ( '__str__' )
return f' { self. name} '
def __call__ ( self, * args, ** kwargs) :
print ( '__call__' )
return f' { self. name} '
def __getattr__ ( self, item) :
print ( f' { item} ,不存在' )
def __getitem__ ( self, item) :
print ( '000' )
def __setattr__ ( self, key, value) :
print ( '__setattr__' )
def __enter__ ( self) :
print ( '__enter__' )
return '333'
def __exit__ ( self, exc_type, exc_val, exc_tb) :
print ( '__exit__' )
def __getitem ( self, exc_type) :
print ( '__exit__' )
ojb1 = C1( 'moon' )
with ojb1 as f:
print ( f)
'''
ojb1 = C1('moon')
# 给对象添加或更改 独有的数据时,会自动执行__init__里面的代码
print(ojb1)
# 当执行打印对象的操作时,会自动触发__str__函数
a1 = ojb1()
# 对象加括号为自动触发_call__里面的代码,如果有返回值,则可以用变量接收
print(a1)
# a1 接收到了__call__返回的值
# ojb1.hhh
# 当对象.一个不存在的名字是 自动触发 __getattr__函数
ojb1.age = '周芷若'
# 有赋值符号时 触发 __setattr__函数
'''
魔法方法小练习
class Context :
def do_something ( self) :
print ( '123' )
def __enter__ ( self) :
return self
def __exit__ ( self, exc_type, exc_val, exc_tb) :
pass
with Context( ) as f:
f. do_something( )
2. 自定义字典类型并让字典能够通过句点符的方式操作键值对
class Mydict ( dict ) :
def __setattr__ ( self, key, value) :
self[ key] = value
def __getattr__ ( self, item) :
return self. get( item)
obj = Mydict( )
obj. name = 'moon'
obj. age = 17
print ( obj)
print ( obj. name)
'''
思路:首先想到要用类去继承这个字典,然后添加额外的操作
'''
元类简介
''' 推导步骤1:如何查看数据的数据类型 '''
"""推导步骤2:其实type方法是用来查看产生对象的类名"""
"""推导步骤3:python中一切皆对象 我们好奇type查看类名显示的是什么"""
class Student :
pass
obj = Student( )
print ( type ( obj) )
print ( type ( Student) )
class A : pass
class B : pass
print ( type ( A) , type ( B) )
"""结论:我们定义的类其实都是由type类产生的>>>:元类(产生类的类)"""
产生类的两种方式
1. 关键词 class 创建
class C1 :
name = 'moon'
2. 利用元类 type 来创建类
type ( 类名, ( 是否有父类) , { 名称空间} )
type ( 'C1' , ( ) , { 'name' : 'moon' } )
a1 = C1( )
a2 = type ( 'C1' , ( ) , { 'name' : 'moon' } ) ( )
print ( a1. name)
print ( a2. name)
print ( type ( a1) )
print ( type ( a2) )
'''
所以得出结论,利用class 创建 类 或者 type(类名,(是否有父类),{名称空间})
都是一样的 2种创建类的方法
'''
元类定制类的方法
1. 首先我们得到 类是由元类 产生的, 元类是 type
2. 如果我们想控制类的产生,那就要想办法 重新 产生类的过程
3. 类是通过元类里面的__init__方法产生的
4. 那么我们只需要改变元类的这个方法就可以了
class Mytype ( type ) :
def __init__ ( self, what, bases= None , dict = None ) :
if not what. istitle( ) :
raise TypeError( '命名错误,首字母需要大写' )
super ( ) . __init__( what, bases, dict )
class V1 ( metaclass= Mytype) :
pass
'''
这样就达到了我们的需求
元类定制类的方法:就是重写元类中产生类的方法,然后增加控制
在创建新的类时,更改类的元类
'''
元类定制对象的方法
"""
推导
对象加括号会执行产生该对象类里面的 __call__
类加括号会执行产生该类的类里面的 __call__
"""
"""给对象添加独有数据的时候 必须采用关键字参数传参"""
class Mytype ( type ) :
def __call__ ( self, * args, ** kwargs) :
if args:
raise TypeError( '必须按照关键词传参' )
return super ( ) . __call__( * args, ** kwargs)
class C1 ( metaclass= Mytype) :
def __init__ ( self, name, age) :
self. name = name
self. age = age
res = C1( name = 'moon' , age = 18 )
魔法方法之双下new
class Mytype ( type ) :
def __call__ ( self, * args, ** kwargs) :
res = self. __new__( self)
self. __init__( res, * args, ** kwargs)
return res
class C1 ( metaclass= Mytype) :
def __init__ ( self, name, age) :
self. name = name
self. age = age
res = C1( 'moon' , 18 )
print ( res. age)
设计模式简介
1. 设计模式
前人通过大量的验证创建出来解决一些问题的固定高效方法
2 . IT行业
23 种
创建型
结构型
行为型
ps: 课下感兴趣可以简单看看
3. 单例模式
类加括号无论执行多少次永远只会产生一个对象
目的:
当类中有很多非常强大的方法 我们在程序中很多地方都需要使用
如果不做单例 会产生很多无用的对象浪费存储空间
我们想着使用单例模式 整个程序就用一个对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了