面向对象高级

面向对象进阶

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

class Foo(object):
    pass
obj = Foo()
print(isinstance(obj,Foo))

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

class Foo(object):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar,Foo))

反射

1、什么是反射??

主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
2、python中面向对象的反射:通过字符串的形式操作对象的属性。python中一切皆对象,都可以使用反射。

四个可以实现反射的函数--适用与类和对象

hasattr(object,name)
##判断object中有没有一个name字符串对应的方法或属性,返回布尔值
class test():
    name = 'egon'
    def run(self):
        return 'helloworld'

t = test()
print(hasattr(t,'run'))
print(hasattr(t,'helloworld'))

-----------------------------
getattr(object,name) 
#获取对象object的属性或者方法

class teat():
    name = 'egon'
    def run(self):
        return 'helloworld'

t = teat()
getattr(t,'name') #获取name属性。存在就打印出来
getattr(t,'run') #获取run方法,存在就打印方法的内存地址,加括号可以直接运行
getattr(t,'age') #获取一个不存在的属性。报错
getattr(t,'age','18') # 若属性不存在,返回一个默认值

------------------------------

# setattr(object,name,value)
#给对象的属性赋值,如属性不存在,就先创建再赋值
class test():
    name = 'xiaohua'
    def run(self):
        return 'helloword'

t = test()
hasattr(t,'age') #判断属性是否存在
setattr(t,'age','18') #为属性赋值,没有返回值
hasattr(t,'age') #属性存在来

-----------------------------------------------
def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.

    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass

四种函数的实例

class BlackMedium:
    feature = 'Ugly'
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr

    def sell_house(self):
        print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)

    def rent_house(self):
        print('%s 黑中介租房子啦,傻逼才租呢' %self.name)

b1 = BlackMedium('坐而论道','起而行之')

#监测是否含有某属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))

#获取属性
n = getattr(b1,'name')
print(n)
func = getattr(b1,'rent_house')
func()
print(getattr(b1,'aaaaa','不存在啊'))

#设置属性
setattr(b1,'sd',True)
setattr(b1,'show_name',lambda self:self.name+'sb')
print(b1.__dict__)
print(b1.show_name(b1))

#删除属性
delattr(b1,'addr')
delattr(b1,'show_name')
delattr(b1,'show_nameall') #不存在,则报错

类也是对象

class Foo(object):
    staticField = 'old boy'

    def __init__(self):
        self.name = 'xiaoming'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

print(getattr(Foo,'staticField'))
print(getattr(Foo,'func'))
print(getattr(Foo,'bar'))

反射当前模块成员

import sys

def s1():
    print('s1')

def s2():
    print('s2')

this_module = sys.modules[__name__]

print(hasattr(this_module,'s1'))
print(getattr(this_module,'s2'))
posted @ 2018-06-15 19:49  木夂口  阅读(133)  评论(0编辑  收藏  举报
levels of contents