您的位置:新葡亰496net > 奥门新萄京娱乐场 > python之面向对象晋级,python之面向对象的尖端晋

python之面向对象晋级,python之面向对象的尖端晋

发布时间:2019-06-19 12:39编辑:奥门新萄京娱乐场浏览(193)

     

    python面向对象编程,

     

    Python-面向对象进阶,python-进阶

    一、isinstance(obj, cls) and issubclass(sub, super)

    1. isinstance(obj, cls),检查obj是否是类cls的对象

    1 class A:
    2     pass
    3 
    4 obj = A()
    5 print(isinstance(obj, A))
    6 
    7 #运行结果
    8 #True
    

    2. issubclass(sub, super),检查sub类是否是super类的派生类(子类)

     1 class A:
     2     pass
     3 
     4 class B(A):
     5     pass
     6 
     7 print(issubclass(B, A))
     8 
     9 #运行结果
    10 #True
    

    二、反射

    1. 什么是反射

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

    2. python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。

    新葡亰496net 1

     1 class People:
     2     country = 'China'
     3     def __init__(self, name, age):
     4         self.name = name
     5         self.age = age
     6 
     7     def info(self):
     8         print('%s is %d years old' % (self.name, self.age))
     9 
    10 p = People('jack', 18)
    11 
    12 #hasattr(obj, name),检查属性
    13 print(hasattr(p, 'info'))   #检查对象p是否有‘info’属性,结果True
    14 print(hasattr(p, 'name'))   #检查对象p是否有‘name’属性,结果True
    15 
    16 #getattr(obj, name)获取属性
    17 print(getattr(p, 'name'))   #获得对象p的‘name’属性,结果:返回p.name的值,即jack
    18 print(getattr(p, 'info'))   #获得对象p的‘info’属性,结果:返回p.info的值,
    19                             # 即绑定方法info的内存地址:<bound method People.info of <__main__.People object at 0x000001B64317ABE0>>
    20 getattr(p, 'info')()        #由于getattr返回的是对象方法属性的内存地址,加()就可以调用,结果:jack is 18 years old
    21 
    22 #setattr(x, y, v)设置属性
    23 setattr(p, 'age', 21)       #修改对象p的‘age’属性,结果:p.age的值变为21
    24 setattr(p, 'sex', 'male')   #新增对象p的‘sex’属性,结果:p.sex的值为male
    25 print(p.__dict__)           #查看对象p的数据属性,结果:{'name': 'jack', 'age': 21, 'sex': 'male'}
    26 
    27 #delattr(x, y)删除属性
    28 delattr(p, 'sex')           #删除对象p的‘sex’属性
    29 print(p.__dict__)           #结果:{'name': 'jack', 'age': 21}
    

    四个可以实现自省的函数:hasattr(obj, name);getattr(obj, name);setattr(x, y, v);delattr(x, y) 新葡亰496net 2

     1 #类也是对象
     2 class Foo(object):
     3     staticField = "old boy"
     4 
     5     def __init__(self):
     6         self.name = 'wupeiqi'
     7 
     8     def func(self):
     9         return 'func'
    10 
    11     @staticmethod
    12     def bar():
    13         return 'bar'
    14 
    15 
    16 print(getattr(Foo, 'staticField'))  #获取类的'staticField'属性,结果:old boy
    17 
    18 print(getattr(Foo, 'func'))         #获取类的'func'属性,结果:<function Foo.func at 0x0000018156FBB950>
    19 print(getattr(Foo, 'func')('self'))     #加()调用方法,结果:func
    20 
    21 print(getattr(Foo, 'bar'))          #获取类的'bar'属性,结果:<function Foo.bar at 0x00000192D2AFB9D8>
    22 print(getattr(Foo, 'bar')())        #加()调用方法,结果:bar
    

    类也是对象,能够应用反射 新葡亰496net 3

     1 #反射当前模块成员
     2 #!/usr/bin/env python
     3 # -*- coding:utf-8 -*-
     4 
     5 import sys
     6 
     7 
     8 def s1():
     9     print('s1')
    10 
    11 
    12 def s2():
    13     print('s2')
    14 
    15 
    16 this_module = sys.modules[__name__]
    17 
    18 print(this_module)                      #结果:<module '__main__' from '......'>
    19 print(hasattr(this_module, 's1'))       #结果:True
    20 print(getattr(this_module, 's2'))       #结果:<function s2 at 0x0000020590EAB8C8>
    21 getattr(this_module, 's2')()            #结果:s2
    

    模块也是对象,能够应用反射

    3. 反射的好处

    好处一:实现可插拔机制

    有俩程序员,一个lili,一个是egon,lili在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,还没有完成他写的类,lili想到了反射,使用了反射机制lili可以继续完成自己的代码,等egon度蜜月回来后再继续完成类的定义并且去实现lili想要的功能。

    总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能。

     1 class FtpClient:
     2     'ftp客户端,但是还么有实现具体的功能'
     3     def __init__(self,addr):
     4         print('正在连接服务器[%s]' 
    		

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:python之面向对象晋级,python之面向对象的尖端晋

    关键词: