27 python中的魔法方法

python中的魔法方法

1 __init__:类实例化会触发

2 __str__:打印对象会触发

3 __call__:对象()触发,类也是对象 类(),类的实例化过程调用元类的__call__

4__new__:在类实例化会触发,它比__init__早(造出裸体的人,__init__穿衣服)

5 __del__:del 对象,对象回收的时候触发

6__setattr__,__getattr__:(.拦截方法),当对象.属性--》赋值会调用setattr,如果是取值会调用getattr

7__getitem__,__setitem__:([]拦截)

8__enter__和__exit__ 上下文管理器

9 __eq__两个对象比较

 

  • str函数或者print函数—>obj.str()
  • repr或者交互式解释器—>obj.repr()
  • 如果str没有被定义,那么就会使用repr来代替输出
  • 注意:这俩方法的返回值必须是字符串,否则抛出异常

 

案例1:写一个类,有个name属性,如果name赋值为非字符串,就不让放

class Person:
    def __int__(self):
        self.name = 'dzg'

    def __setattr__(self, key, value):
        if isinstance(value,str):
            self.__dict__[key]=value
        else:
            raise TypeError('必须是str类型')

p1 = Person()
p1.age = 66

 



 

 

案例2 :__setitem__: [] 拦截

 

 

class Person:
    def __int__(self):
        self.name = 'dzg'

    def __setitem__(self, key, value):
        setattr(self,key,value)


p1 = Person()
p1['age'] = 66
print(p1.__dict__)

 

 

案例3 :__getitem__: [] 拦截

 

 

class Person:
    def __int__(self):
        self.name = 'dzg'

    def __setitem__(self, key, value):
        setattr(self,key,value)

    def __getitem__(self, item):
        return getattr(self,item)

p1 = Person()
p1['age'] = 66
print(p1['age'])

 

 

案例4 :with 上下文管理器

class Person:
    def __enter__(self):
        print("我在with管理的时候,会触发")
        print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量')
        return 'oo'

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出with代码块时执行此方法')
        print('1', exc_type)
        print('2', exc_val)
        print('3', exc_tb)


with Person() as p:   # 这句话执行,会触发类的__enter__
    print(p)

 

 

案例4 : __eq__

当执行==时,会触发__eq__的执行,并且把b传进去,就是object

==后只要是对象,就可以传进去,就是object

class A:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self,obj):
        # 打印出比较的第二个对象的x值
        print(obj.x)
        if self.x +self.y == obj.x+obj.y:
            return True
        else:
            return False


a = A(1, 2)
b = A(99, 3)
print(a == b)

 

 

 

 

案例5:通过上下文管理器写一个mysql的连接,通过with管理

import pymysql
class Mysql():
    def __enter__(self):
        self.conn = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            password='123',
            database='db1',
            charset='utf8'  # 编码千万不要加-
        )
        return self.conn

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.close()


with Mysql() as mysql:
    cursor = mysql.cursor()
    sql = 'select * from test;'
    res = cursor.execute(sql)
    print(cursor.fetchone())

 

 

posted @ 2021-11-14 14:57  甜甜de微笑  阅读(33)  评论(0编辑  收藏  举报