暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python列出多重继承类的每个对象属性

原创 梯阅线条 2023-12-16
142

1 python列出多重继承类的每个对象属性

1.1 列出实例属性

python通过__dict__列出实例属性。

(1) 实例.__class__:获取实例所属类。

(2) 类.__name__:获取类的名称。

(3) 实例.__class__.__name__:获取实例的类的名称。

(4) 实例.__dict__:获取实例的属性字典。

(5) id(实例):获取实例的内存地址。

(6) __attrnames:伪私有属性,自动扩展为_ListInstance__attrnames。

(7) __str__:重载__str__,使用print时自动调用__str__。

示例

lister.py

class ListInstance: def __str__(self): return '<Instance of {},address {}:\n{}>'.format( self.__class__.__name__,id(self),self.__attrnames()) def __attrnames(self): result='' for attr in sorted(self.__dict__): result+='\tname {}={}\n'.format(attr,self.__dict__[attr]) return result

单继承print调用__str__

>>> import os >>> os.chdir(r'E:\documents\F盘') >>> from lister import ListInstance >>> class PubAcct(ListInstance): def __init__(self): self.name='梯阅线条' >>> pa=PubAcct() >>> print(pa) <Instance of PubAcct,address 61570576: name name=梯阅线条 > >>> pa <__main__.PubAcct object at 0x03AB7E10> >>> str(pa) '<Instance of PubAcct,address 61570576:\n\tname name=梯阅线条\n>'

testmulclass.py

from lister import * class BaseC1: def __init__(self): self.title1='梯阅线条' def m1(self):pass class SubC1(BaseC1,ListInstance): def __init__(self): super().__init__() self.title2='tyxt.work' self.title3='软件测试开发' def m2(self):pass if __name__=='__main__': sc1=SubC1() print(sc1)

多继承print调用__str__

>>> import os >>> os.chdir(r'E:\documents\F盘') >>> from testmulclass import * >>> sc1=SubC1() >>> print(sc1) <Instance of SubC1,address 60595344: name title1=梯阅线条 name title2=tyxt.work name title3=软件测试开发 >

1.2 列出继承属性

python通过dir(实例)列出实例及其基类的属性。

(1) attr[:2]和attr[-2:]去掉内置属性:双下化下开头和结尾的属性。

(2) getattr(实例,属性名):获取实例属性,包括继承属性。

示例

lister.py

class ListInherited: def __str__(self): return '<Instance of {},address {}:\n{}>'.format( self.__class__.__name__,id(self),self.__attrnames()) def __attrnames(self): result='' for attr in dir(self): if attr[:2]=='__' and attr[-2:]=='__': result+='\tname {}=<>\n'.format(attr) else: result+='\tname {}={}\n'.format(attr,getattr(self,attr)) return result

testmulclass.py

from lister import * class BaseC1: def __init__(self): self.title1='梯阅线条' def m1(self):pass class SubC1(BaseC1,ListInstance): def __init__(self): super().__init__() self.title2='tyxt.work' self.title3='软件测试开发' def m2(self):pass class SubC2(BaseC1,ListInherited): def __init__(self): super().__init__() self.title2='tyxt.work' self.title3='软件测试开发' def m2(self):pass if __name__=='__main__': sc1=SubC1() print(sc1) sc2=SubC2() print(sc2)

多继承print调用__str__

>>> import os >>> os.chdir(r'E:\documents\F盘') >>> sc2=SubC2() Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> sc2=SubC2() NameError: name 'SubC2' is not defined >>> from testmulclass import * >>> sc2=SubC2() >>> print(sc2) <Instance of SubC2,address 57252176: name _ListInherited__attrnames=<bound method ListInherited.__attrnames of <testmulclass.SubC2 object at 0x03699950>> name __class__=<> name __delattr__=<> ...... name __subclasshook__=<> name __weakref__=<> name m1=<bound method BaseC1.m1 of <testmulclass.SubC2 object at 0x03699950>> name m2=<bound method SubC2.m2 of <testmulclass.SubC2 object at 0x03699950>> name title1=梯阅线条 name title2=tyxt.work name title3=软件测试开发 >

1.3 列出每个对象的属性

python通过实例.__class__获取所属类,通过类.__bases__获取全部基类,通过实例.__dict__获取属性,从而获取每个对象的属性。

示例

lister.py

class ListTree: def __str__(self): self.__visited={} return '<Instance of {0},address {1}:\n{2}{3}>'.format( self.__class__.__name__,id(self), self.__attrnames(self,0), self.__listclass(self.__class__,4)) def __listclass(self,aClass,indent): dots='.'*indent if aClass in self.__visited: return '\n{0}<Class {1}:,address {2}:(see above)>\n'.format(dots,aClass.__name__,id(aClass)) else: self.__visited[aClass]=True genabove=(self.__listclass(c,indent+4) for c in aClass.__bases__) return '\n{0}<Class {1},address {2}:\n{3}{4}{5}>\n'.format(dots,aClass.__name__,id(aClass), self.__attrnames(aClass,indent),''.join(genabove),dots) def __attrnames(self,obj,indent): spaces=' '*(indent+4) result='' for attr in sorted(obj.__dict__): if attr.startswith('__') and attr.endswith('__'): result+=spaces+'{0}=<>\n'.format(attr) else: result+=spaces+'{0}={1}\n'.format(attr,getattr(obj,attr)) return result

testmulclass.py

class SubC3(BaseC1,ListTree): def __init__(self): super().__init__() self.title2='tyxt.work' self.title3='软件测试开发' def m2(self):pass

多继承列出每个对象的属性

>>> import os >>> os.chdir(r'E:\documents\F盘') >>> from testmulclass import * >>> sc3=SubC3() >>> print(sc3) <Instance of SubC3,address 57711792: _ListTree__visited={} title1=梯阅线条 title2=tyxt.work title3=软件测试开发 ....<Class SubC3,address 57923944: __doc__=<> __init__=<> __module__=<> m2=<function SubC3.m2 at 0x0371B660> ........<Class BaseC1,address 57922528: __dict__=<> __doc__=<> __init__=<> __module__=<> __weakref__=<> m1=<function BaseC1.m1 at 0x0371B4B0> ............<Class object,address 1813587016: __class__=<> __delattr__=<> __dir__=<> __doc__=<> __eq__=<> __format__=<> __ge__=<> __getattribute__=<> __gt__=<> __hash__=<> __init__=<> __init_subclass__=<> __le__=<> __lt__=<> __ne__=<> __new__=<> __reduce__=<> __reduce_ex__=<> __repr__=<> __setattr__=<> __sizeof__=<> __str__=<> __subclasshook__=<> ............> ........> ........<Class ListTree,address 57922056: _ListTree__attrnames=<function ListTree.__attrnames at 0x0371B468> _ListTree__listclass=<function ListTree.__listclass at 0x0371B420> __dict__=<> __doc__=<> __module__=<> __str__=<> __weakref__=<> ............<Class object:,address 1813587016:(see above)> ........> ....> >

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

文章转载自梯阅线条,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论