本文内容纯属自己理解,如有错误欢迎指正!
一、特殊类属性
instance.__class__
显示类的链接
instance.__class__.__name__
显示类的名称
object.__dict__
提供对象的属性字典,是一个键值对
还有个比较重要的内置函数:
getattr(obect,key)获取’object对象’的’key’属性
>>> from person import Person
>>> bob = Person('Bob Smith')
>>> bob.__class__
<class 'person.Person'>
>>> bob.__class__.__name__
'Person'
>>> for key in bob.__dict__:
print(key,'====',bob.__dict__[key])
name ==== Bob Smith
job ==== None
pay ==== 0
>>> for key in bob.__dict__:
print(key,'====',getattr(bob,key))
name ==== Bob Smith
job ==== None
pay ==== 0
>>>
二、通用显示工具的实现
保存为classtools的模块:
class AttrDisplay:
def gatherAttrs(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.gatherAttrs())#自动获取类的名称和该类的属性。
#就这么简单,根据不同的实例自动获取类名和属性。
#下边是测试代码,可以忽略了
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)
print(Y)
保存为person的类,这是一个类的最终形式
from classtools import AttrDisplay #导入模块中AttrDisplay类
class Person(AttrDisplay):#继承AttrDisplay类
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 giveRaise(self,percent):
self.pay = int(self.pay*(1+percent))
class Manager(Person):
def __init__(self,name,pay):#初始化manager类
Person.__init__(self,name,'mgr',pay)#通过继承Person类,目的是自动提供job = 'mgr'
def giveRaise(self,person,bouns=.10):
Person.giveRaise(self,person+bouns)#因为继承了AttrDisplay类,自动调用__str__打印相关内容,所以这里省略了
if __name__ == '__main__':
bob = Person('Bob Smith')
sue = Person('Sue Jones',job = 'dev',pay = 100000)
print(bob)
print(sue)
print(bob.lastname(),sue.lastname())
sue.giveRaise(.10)
print(sue)
tom = Manager('Tom Jones',50000)
tom.giveRaise(.10)
print(tom.lastname())
print(tom)