python面向对象——常用内置方法

复制代码
class Person(): 
    #构造函数
    def __init__(self,name,age=None): 
        self.name=name 
        self.age=age
        self.lists=[1,3,5]
        self.dicts={}
    #打印函数,类似java中的toSring()
    def __str__(self):
        return 'Peason(%s)'%self.name
    #对象的字典表示
    def __dict__(self):
        return {'name':self.name}
    #对象相加
    def __add__(self,obj):
        return self.age+obj.age
    #匹配对象[index]模式
    def __getitem__(self,item):
        return self.lists[item]
    #匹配对象[key]=value模式
    def __setitem__(self,k,v):
        self.dicts[k]=v
        print(self.dicts)
    #匹配del 对象
    def __delitem__(self,k):
        del self.dicts[k]
        print(self.dicts)
    #可迭代对象必须实现
    def __iter__(self):
        return iter(self.lists)
    #在类的对象被执行的时候obj()会执行
    def __call__(self,args,**kwargs):
        print('i was called!%s,%s'%(args,kwargs['b']))
    #在类对象被int()处理时调用
    def __int__(self):
        return self.age


if __name__=='__main__':
    li=Person('lili')
    print(li)
    print(li.__dict__())
    li['score']=100
    li['score2']=200
    del li['score']
    for i in li:
        print(i)
    li(10,b=20)
    li.age=30
    print(int(li))
复制代码

 

getattr、setattr、delattr

当使用obj.x = y的时候触发对象的setattr方法,当del obj.x的时候触发对象的delattr方法。
当尝试访问对象的一个不存在的属性时 obj.noexist 会触发getattr方法,getattr方法是属性查找中优先级最低的。
可以重写这3个方法来控制对象属性的访问、设置和删除。
**特别注意:如果定义了getattr,而没有任何代码(即只有pass),则所有不存在的属性值都是None而不会报错,可以使用super().__getattr__()方法来处理**

复制代码
class Student:
    def __getattr__(self, item):
        print('访问一个不存在的属性时候触发')
        return '不存在'

    def __setattr__(self, key, value):
        print('设置一个属性值的时候触发')
        # self.key = value  # 这样会无限循环
        self.__dict__[key] = value

    def __delattr__(self, item):
        print('删除一个属性的时候触发')
        if self.__dict__.get(item, None):
            del self.__dict__[item]

stu = Student()
stu.name = 'zlw'  # 设置一个属性值的时候触发
print(stu.noexit)  # 访问一个不存在的属性时候触发 , 返回'不存在'
del stu.name  # 删除一个属性的时候触发
复制代码

 

enter、exit

这两个方法的重写可以让我们对一个对象使用with方法来处理工作前的准备,以及工作之后的清扫行为。

复制代码
class db_conn(object):

    def __init__(self, conn_id):
        self.conn = MySqlHook.get_connection(conn_id=conn_id).get_hook().get_conn()
        self.cur = self.conn.cursor()

    def __enter__(self):
        return self.cur

    def __exit__(self, exc_type, exc_value, exc_trace):
        self.conn.commit()
        self.cur.close()
        self.conn.close()
复制代码

 

iter、next

这2个方法用于将一个对象模拟成序列。内置类型如列表、元组都可以被迭代,文件对象也可以被迭代获取每一行内容。重写这两个方法就可以实现自定义的迭代对象。

复制代码
class MyRange():
    def __init__(self,begin,end,step):
        self.begin=begin
        self.end=end
        self.step=step
        self.count=0

    def __iter__(self):
        return self

    def __next__(self):
        if self.begin <self.end:
            self.count=self.begin
            self.begin=self.begin+self.step
            return self.count
        else:
            raise StopIteration('已经到达临界')

if __name__=='__main__':
    ra=MyRange(1,20,3)
    for item in ra:
        print(item)
复制代码

 

posted @   Mars.wang  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示