zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    第一阶段SCRUM冲刺10
    第一阶段SCRUM冲刺09
    第一阶段SCRUM冲刺08
    单词统计续
    第十一周学习报告
    第一阶段SCRUM冲刺07
    第一阶段SCRUM冲刺06
    第一阶段SCRUM冲刺05
    十天冲刺08
    十天冲刺07
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/12098536.html
Copyright © 2011-2022 走看看