python 内省工具

#内省工具是特殊的属性和函数,允许我们访问对象实现的一些内部机制
class Person:
    def __init__(self, name, job=None, pay=0):
        self.name=name
        self.job=job
        self.pay=pay
    
    def lastName(self):
        return self.name.split()[-1]
    
    def giveRaist(self, percent):
        self.pay=int(self.pay*(1+percent))
        
    def __str__(self):
        return '[Person: %s, %s]'%(self.name, self.pay)
    
class Manager(Person):
    def __init__(self, name, pay=0):
        self.person=Person(name, 'mgr', pay)
        
    def giveRaist(self, percent):
        self.person.giveRaist(percent+1)
        
    def __getattr__(self, attr):
        return getattr(self.person, attr)
    
    def __str__(self):
        return 'sss'+str(self.person)

bob=Person('bob li', 'a')
sue=Person('sue zhang', 'b', 10000)
tom=Manager('tom zhao', 20000)

class Department:
    def __init__(self, *args):
        self.members=list(args)
    def addMember(self, person):
        self.members.append(person)
    def giveRaist(self, percent):
        for person in self.members:
            person.giveRaist(percent)
    def showAll(self):
        for person in self.members:
            print(person)
            
deve=Department(bob, sue)   
deve.addMember(tom)
deve.giveRaist(1.1)
deve.showAll()

#内省工具是特殊的属性和函数,允许我们访问对象实现的一些内部机制
#instance.__class__属性提供了一个从实例到创建他的类的连接
print(deve.__class__, deve.__class__.__name__)   #<class '__main__.Department'>  Department
print(bob.__class__)   #<class '__main__.Person'>
print(tom.__class__)   #<class '__main__.Manager'>

#class.__bases__属性获取类的超类元祖
print(Manager.__bases__)   #(<class '__main__.Person'>,)

#instance.__dict__属性提供一个包含全部属性的字典
print(bob.__dict__)   #{'name': 'bob li', 'job': 'a', 'pay': 0}
for key in bob.__dict__:
    print(key,'=>',getattr(bob, key))
    
class AttrDisplay():
    def gatherAtters(self):
        attrs=[]
        for key in sorted(self.__dict__):
            attrs.append('%s=%s'%(key, getattr(self, key)))
        return ', '.join(attrs)
    
    def __str__(self):
        return '[%s: %s]'%(self.__class__.__name__, self.gatherAtters())
    
if __name__=='__main__':
    class TopTest(AttrDisplay):
        count=0
        def __init__(self):
            self.attr1=TopTest.count
            self.attr2=TopTest.count+1
            TopTest.count+=2
    class SubTest(TopTest):
        pass
    
    x,y=TopTest(), SubTest()
    print(x,y)    #[TopTest: attr1=0, attr2=1] [SubTest: attr1=2, attr2=3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值