Python随心记--类的内置attr属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python随心记--类的内置attr属性相关的知识,希望对你有一定的参考价值。

class Foo:
    x = 1
    def __init__(self,y):
        self.y = y
    def __getattr__(self, item):   #如果对象不存在的属性是会触发
        print(执行了__gerattr__)
    def __delattr__(self, item):   #删除的时候会触发
        print(执行了__delattr__)
        self.__dict__.pop(item)
    def __setattr__(self, key, value):   #设置属性是会触发,比如foo.x 当x不存在的时候就会触发__setattr__
        print(执行了__setattr__)
        #self.key = value   #不能致盲设置属性,会变成死循环(递归)
        self.__dict__[key] = value
foo = Foo(11)
print(dir(Foo))
组合的方式完成授权
import time
class FileHandle:
    def __init__(self,filename,mode=r,encoding=utf8):
        # self.filename = filename
        self.file = open(filename,mode,encoding=utf8)
        self.mode = mode
        self.encoding = encoding

    def write(self,line):
        t = time.strftime(%Y-%m-%d %T)
        return self.file.write(%s %s %(t,line))
    def __getattr__(self, item):
        # print(‘您请求的方法不存在‘)
        # self.file.read
        return getattr(self.file,item)   #返回self.file中的read方法

filehandle = FileHandle(a.txt,w+)
# print(filehandle.read)
filehandle.write(1111
)
filehandle.write(2222
)
filehandle.write(3333
)

继承+派生完成包装
class List(list):
    def show_medllo(self):
        mid_index = int(len(self)/2);
        return self[mid_index]
    def append(self, p_object):
        if type(p_object) is str:
            # list.append(self,p_object)
            super().append(p_object)
        else:
           print(O(∩_∩)O,类型错了)
li = List(helloworld)


print(li.show_medllo())
li.append(720)
print(li)

issubclass() isinstance()
class Foo:
    pass
foo = Foo()
isinstance(foo,Foo)
issubclass(C,B)   #c类名雷曼B 判断c是否是继承B
__getattribute__
class Foo:
    def __init__(self,x):
        self.x = x
    def __getattr__(self, item):
        print(执行了__getattr__)
    def __getattribute__(self, item):   #属性有或者没有都出发她
        print(执行了__getattribute__)
        raise AttributeError(抛出异常了)
        # raise TabError(‘xxxxxxxxxxxxx‘)
foo = Foo(1)

foo.xxxx
item系列
class Foo:
    def __getitem__(self, item):
        print(getitem)
    def __setitem__(self, key, value):
        print(setitem)
    def __delitem__(self, key):
        print(delitem)

__str__ :自定义对象的显示方式
__repr__:自定义对象的显示方式

class Foo:
    def __str__(self):
        return 自定义对象的显示方式
    def __repr__(self):
        return 自定义对象的显示方式1

定制__format__
x = {0}{0}{0}.format(dog)
print(x)
format_dic={
    ymd:{0.year}{0.mon}{0.day},
    m-d-y:{0.mon}-{0.day}-{0.year},
    y:m:d:{0.year}:{0.mon}:{0.day}
}
class Date:
    def __init__(self,year,mon,day):
        self.year=year
        self.mon=mon
        self.day=day
    def __format__(self, format_spec):
        print(我执行啦)
        print(--->,format_spec)
        if not format_spec or format_spec not in format_dic:
            format_spec=ymd
        fm=format_dic[format_spec]
        return fm.format(self)
d1=Date(2016,12,26)
# format(d1) #d1.__format__()
# print(format(d1))
print(format(d1,ymd))
print(format(d1,y:m:d))
print(format(d1,m-d-y))
print(format(d1,m-d:y))
print(===========>,format(d1,asdfasdfsadfasdfasdfasdfasdfasdfasdfasdfasdfasdfasd))
slots 属性 ,可节省内存(不推荐使用)
class Foo:
    __slots__ = [name,age]   #实例化的对象不再有__dict__方法

f = Foo()
f.name = lin
print(f.name)
__class__、__module__:查看对象来自那一模块

__del__:析构方法

__call__
class Foo:
    def __call__(self, *args, **kwargs):
        print(对象加小括号()也可以运行啦)
f = Foo()
f()
迭代器协议:

class Foo:
    def __init__(self,n):
        self.n = n
    def __iter__(self):   #加上后对象就可迭代 ,for循环
        pass

    def __next__(self):
        if self.n == 13:
            raise StopIteration(凉了)
        self.n += 1
        return self.n

f = Foo(10)
print(f.__next__())
print(f.__next__())
print(f.__next__())

#斐那锲波
class Fib:
    def __init__(self):
        self._a = 1
        self._b = 1

    def __iter__(self):
        return self

    def __next__(self):
        if self._a > 100:
            raise StopIteration(凉凉了)
        self._a,self._b = self._b,self._a + self._b

        return self._a

f = Fib()
print(next(f))
print(next(f))

for i in f:
    print(i)

 

 
 








以上是关于Python随心记--类的内置attr属性的主要内容,如果未能解决你的问题,请参考以下文章

前端随心记---------Javascript系列(第八节.BOM)

Python随心记

Python随心记--反射动态导入模块

类内置的attr属性

Python进阶-----类的内置item属性方法

Python随心记--装饰器