打赏

Python基础(28)——面向对象进阶

因为在Python中万物皆对象,所以凡是对象都可以用发射,使用这几种方法 getattr   hasattr   setattr  delattr

反射的好处1、可插拔 并行工作  2、动态导入模块

内置函数补充:

isinstance一个实例是否是一个类的实例,判断上级类,父类,上上层类的判断的实例都是True,而type显示的是父类

issubclass   一个类是否是另个类的子类

__item__等方法:字典触发形式

双下划线 getattribute   和getattr 的区别,   无论有无都会触发这个函数,优先级比后者高,而当前者里面抛出错误的情况下才会触发后者raise 异常报错,这是他的工作机制,实际上没啥用系统默认的工作机制就自然实现了

__getitem__     __setitem__    __delitem__     与之前的getattr 就是表现形式不一样,这个是用一种字典的表示形式来作用,触发条件是用字典形式表达才会,f["name"]='alex',而f.name=‘’alex‘’是会触发attr系列的

改变对象的字符串显示,改变实例化对象输出结果  __str__   __repr__

一切皆对象,那么实例化的一个列表对象为什么打印的时候不是回一个地址,而是直接返回字符串列表呢?

list1=list("hello")
print(list1)

lsit1是对象,为什么返回的不是一个地址,这是因为有一些类修改了自己的字符串方法

__str__ 就是控制字符串输出结果的一个函数,print 调用的就是 str(list1)    也等于list1.__str__,所以会返回具体值

而__repr__ 是在调用自己的时候返回值,是解释器中用,当调用的时候在没有str的情况下才找repr  他会实现对象自己的值返回,执行list1  就会返回具体值

这两种情况都是返回字符串类型,其他类型会报错

自订制__format__

字符串格式化修改   format_spec 是这个字典属性,定义输出格式的 

__slots__取代__dict__,为实例提供一个更紧凑的内部方法

对象实例在自己内部找不到的方法和属性都会去找类里的,他自己只不过是一个类指针,类里面是独立的数据属性和方法属性,类中是独立的内存空间,当实例化后,对象的属性字典就单独使用了内存空间,如果成千上万的实例对象都要占据内存,系统资源占用过多

这样就必须优化实例化对象对应的属性字典,这是一种内存优化的方法

类当中如果定义了__slots__='name'  那么__dict__就不起作用了,会报错,如果用实例增删改 都会报错,他限制了 属性的数量,不允许增加属性

__slots__=["name","age"] 可以赋值列表,实例只能使用slots给的属性,实例都没有属性字典了,都要去找slots

初始化的情况,实例对象都是没有被赋值的,需要先赋值才能查找,实例对象中也没有__dict__

__doc__ 文档

‘   内容’  单引号中间就是文档内容

文档描述,文档属性不能被继承,只会在自己这里找,没有就是none

__module__   对象在哪个模块  

__class__ 对象在哪个类

__del__析构函数,执行完程序就会执行这个析构函数来释放内存,系统自动做了,不用管,文件执行完毕就启动执行

__call__     就是加()括号调用的方法,有了这个方法就能用 名字() 来调用了。否则会报错not callable的错误

__next__  __iter__实现迭代器协议

迭代器协议是 对象必须提供一个next方法,执行该方法返回迭代的下一项,要不就报stopiteration异常错误,终止迭代

可迭代对象就是实现了迭代器协议的对象(定义__iter__方法)

for循环首先会调用 iter方法 ,然后就开始调用next 方法,碰到raise 报错就停止,下面是斐波那契数列的类的写法

class fibb:
    def __init__(self):
        self._a=1
        self._b=1

    def __iter__(self):
        return self

    def __next__(self):
        self._a,self._b=self._b,self._a+self._b
        return self._a

f1=fibb()
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
for i in f1:
    print(i)

 

__方法__其实就是方法(self)  的作用可以这么理解 

类中的属性如果给了别人代理,那么dict中也找不到这个属性

描述符优先级

类属性(class1.name=1,等于覆盖字典优先赋值)------数据描述符(get set方法)--------实例描述符(实例赋值操作先找数据描述符找不到才赋值给自己的属性)-----非数据描述符

 

posted on 2019-07-19 17:36  大有哥  阅读(102)  评论(0)    收藏  举报

导航