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\n‘)
filehandle.write(‘2222\n‘)
filehandle.write(‘3333\n‘)

继承+派生完成包装
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)
 
 

原文地址:https://www.cnblogs.com/Essaycode/p/10203879.html

时间: 2024-11-08 02:56:48

Python随心记--类的内置attr属性的相关文章

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

类的内置item相关方法只有在通过字典key操作才会触发而通过点的方式来操作,则触发attr相关方法 class Foo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): print('执行getitem') return self.__dict__[item] def __setitem__(self, key, value): print('执行setitem'

Python之面向对象:类的内置方法

1.def __add__(self,other): c1+c2 两个实例的加法操作就是执行__add__()方法 2.__str__(self): print一个实例的时候,执行的是__str__()这个内置方法 eg: class Vector(object): def __init__(self,a,b): self.a = a self.b = b def __str__(self): return 'Vector(%d,%d)'%(self.a,self.b) def __add__(

python - __setitem__/__getitem__/__delitem__类的内置方法

# class 内置方法: # __setitem__ # __getitem__ # __delitem__ class Test(): X = 100 def __getitem__(self, item): print("getitem") def __setitem__(self, key, value): print("setitem") def __delitem__(self, key): print("delitem") xx =

面向对象——类的内置attr(三十三)

class Foo: x=1 def __init__(self,y): self.y=y def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # self.key=value #这就无限递归了,你好好想想 # self.__dict__[key]=value #应该使用它 def __de

python函数(6):内置函数和匿名函数

我们学了这么多关于函数的知识基本都是自己定义自己使用,那么我们之前用的一些函数并不是我们自己定义的比如说print(),len(),type()等等,它们是哪来的呢? 一.内置函数 由python内部定义好我们可以直接调用的函数就叫内部函数.python一共给我们68个内置函数: abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() as

类的属性、类的方法、类的内置方法

类的属性 变量在类中称为类的属性,函数在类中称为类的方法,类的属性分为以下几种: (1) 公有属性:在类中和类外都能调用的属性,定义的时候与变量的定义一致,如 color = 'yellow'(2) 私有属性:不能在类外及被类以外的函数调用,定义的时候以双下划线开头,如__color = 'yellow' (3) 内置属性: 由系统在定义类的时候默认添加的,定义的时候以前后双下划线构成,如 dict #!/usr/bin/env python class People(object): colo

面向对象:类的内置方法

__str__和__repr__:实例化一个对象,该对象的返回值是一个指向这个类的内存地址 class A: pass a = A() print(a) #打印: <__main__.A object at 0x000001FA526DA108> 自定义__str__和__repr__方法: class Func: pass def __str__(self): return '我是自定义的str' def __repr__(self): return '我是自定义的repr' a = Fun

几个类的内置方法

# 类的内置方法 # 双下方法 # __str__ # 当类中定义了__str__方法后,print(这个类对象时),会调用__str__. 或者格式化%s输出对象时,都会触发__str__ # __repr__ # 当类中定义了__repr__方法后,print(repr(a)),就会调用a对象中的__repr__()方法.格式化输出用%r时同样会调用__repr__ # 同样对象中如果没有定义__repr__方法,那么就会调用父类中的__repr__ # __repr__是__str__的备

Python这7个好用内置函数!

这篇文章我们来看几个很有用的 Python 内置函数 ,我认为每个学习 Python的 都应该知道这些函数. 对于每个函数,我会使用一个普通的实现来和内置函数做对比. 如果我直接引用了内置函数的文档,请理解,因为这些函数文档写的非常棒! all(iterable) 如果可迭代的对象(数组,字符串,列表等,下同)中的元素都是 true (或者为空)的话返回 True . _all = True for item in iterable: if not item: _all = False brea