魔法方法

1 _ _call_ _()
"""
那些可以加()来调用执行的对象,实际是执行了_ _call_ _()方法
"""

# 案例1
class Student:
    school = 'SH'

    # def __call__(self, *args, **kwargs):
    #     print(f'diao yong le __call__()')


stu1 = Student()

print(callable(stu1))


# 案例2
def test():
    print('I am test')


test()  # I am test
test.__call__()  # I am test
View Code

2 _ _str_ _()
print对象时自动触发,将字符串类型值作为本次结果输出
# 无__str__()方法时, 打印对象后得到的是对象的内存地址
class Student:
    school = 'SH'


stu = Student()

print(stu)  # <__main__.Student object at 0x000001204D266D68>


# 有__str__()方法时, 打印对象得到的是对象调用__str__()后的返回值
class Student1:
    school = 'SH'

    def __str__(self):
        return 'I am Student2'


stu1 = Student1()

print(stu1)  # I am Student2
View Code

 

3 _ _del_ _()

代码读到 <del 对象> 或者 程序结束释放内存前触发_ _del_ _()执行

/告诉操作信息: 删除对象之前占用的相关资源,如打开了文件或建立的网络链接/

 

4 _ _new_ _() _ _init_ _()

# _ _new_ _()用于创建对象并返回对象;__init__()用于初始化对象
class Student1(object):
    school = 'SH'

    def __new__(cls, *args, **kwargs):
        print(f'new~')
        ins = object.__new__(cls)
        return ins

    def __init__(self):
        print(f'init~~')
        pass


Student1()

"""
new~
init~~
"""
View Code

 

5 _ _enter_ _() _ _exit_ _()

对象进入或离开某范围要做的特定操作, 比如分配或释放内存、文件操作、网络连接、数据库连接、使用锁的场景; 语法格式是with ... as ../进入with代码块调用类的__enter__方法,离开with代码块调用类的__exit__方法/

数据库应用场景具体: enter方法内建立/拿数据库链接,然后进行数据操作,最后退出时候断开/放回数据库链接.

class Test:
    def __enter__(self):
        print('enter~')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit~')

    def math(self):
        print(f'math~')


with Test() as test:
    test.math()

"""
enter~
math~
exit~
"""
View Code

 

6 _ _setitem_ _()  _ _getitem_ _() 

可以实现 对象[key] = value , 对象中括号往里放值; 以及对象中括号来取值

class Foo:
    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, item):
        print(self.__dict__[item])


f = Foo()

f['name'] = 'lll'

print(f['name'])
View Code

所以: 以后在遇到对象中括号取值或赋值时,要想到它要么是继承了dict要么是重写了 _ _setitem_ _()  _ _getitem_ _() 方法

 

7 _ _setattr_ _() _ _getattr_ _()

# 实现字典可以用点的方法取值设定值
class MyDict(dict):
    # 对象.属性时, 若属性存在,则修改属性值;若不存在,则给对象添加一个该属性
    def __setattr__(self, key, value):
        self[key] = value

    # 对象.属性时,若属性不存在,则自动调用__getattr__方法(至于里面内容怎么写,自己写啥就是啥)
    def __getattr__(self, item):
        return self.get(item)


d1 = {'name': 'json'}

d = MyDict(d1)

print(d.name)  # json
View Code

理解参考: python __getattribute__、__getattr__、__setattr__详解 - 漫漫芜 - 博客园 (cnblogs.com) 

 

8 _ _iter_ _() _ _next_ _()

待补充code 

 

posted @ 2024-03-13 15:25  tslam  阅读(6)  评论(0编辑  收藏  举报