首先,建立一个类,并用该类创建一个对象,分别查看object,类与对象的内置属性
1 importinspect2
3 classFoo():4 ‘‘‘随便瞎写‘‘‘
5 group = ‘buluo‘ #类属性
6
7 @classmethod8 def getnum(cls): #类方法
9 return 123
10
11 def __init__(self):12 self.name = ‘222‘ #对象私有属性
13 self.age = 12
14
15 def changeName(self): #对象绑定方法
16 self.name = self.__class__.getnum()17
18 #创建类,并获取三者内置属性
19 a =Foo();20 inspect.getmembers(object):21 inspect.getmembers(Foo):22 inspect.getmembers(a):
实例类
1 #slot wrapper "插口"包装,继承object类之后进行重写,
2
3 (‘__class__‘, )4 (‘__delattr__‘, )5 (‘__dir__‘, )6 (‘__doc__‘, ‘The most base type‘)7 (‘__eq__‘, )8 (‘__format__‘, )9 (‘__ge__‘, )10 (‘__getattribute__‘, )11 (‘__gt__‘, )12 (‘__hash__‘, )13 (‘__init__‘, )14 (‘__init_subclass__‘, )15 (‘__le__‘, )16 (‘__lt__‘, )17 (‘__ne__‘, )18 (‘__new__‘, )19 (‘__reduce__‘, )20 (‘__reduce_ex__‘, )21 (‘__repr__‘, )22 (‘__setattr__‘, )23 (‘__sizeof__‘, )24 (‘__str__‘, )25 (‘__subclasshook__‘, )
object内置属性
Foo类的内置属性,去掉object重复的,可以看到,多了一个__dict__以及其他方法与属性
(‘__class__‘, )
(‘__dict__‘, mappingproxy({‘__module__‘: ‘__main__‘, ‘__doc__‘: ‘随便瞎写‘, ‘group‘: ‘buluo‘, ‘getnum‘: , ‘__init__‘: , ‘changeName‘: , ‘__dict__‘: , ‘__weakref__‘: }))
(‘__doc__‘, ‘随便瞎写‘)
(‘changeName‘, ) #对于类来说,changeName为类的普通方法
(‘getnum‘, >) #用@staticmethod装饰器的getnum函数为类的绑定方法
(‘group‘, ‘buluo‘)
Foo对象的内置属性
(‘__class__‘, )
(‘__dict__‘, {‘name‘: ‘222‘, ‘age‘: 12}) #对象的__dict__ 只包含私有的属性
#类的静态方法或者方法,对于对象来说,都为绑定方法,绑定对象不同,一个是Foo object,一个是class.__main__.Foo
(‘changeName‘, >)
(‘getnum‘, >)
(‘group‘, ‘buluo‘)
(‘name‘, ‘222‘)
(‘age‘, 12)
总结:1.__dict__为对象的私有属性,对对象来说,则为私有变量(方法并非私有,而是绑定),
对元类的对象(即metaclass为type的类),则为__module__,__doc__,属性、方法以及一个弱引用
2.对象的私有属性不单单会在__dict__中出现,在对象的内置属性内也会存在,而__dict__的存在为了加快处理速度,屏蔽其他不需要注意的属性
----------------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------
疑问:私有属性在__dict__以及内置属性中都出现,对象的大量创建会导致内存压力,如何解决,使用__slots__
通过__slots__将属性固定
1 classFoo_slot():2 group = ‘buluo‘
3 __slots__ = [‘name‘, ‘age‘]4
5 @classmethod6 def getnum(cls): #类方法
7 return 123
8
9 def changeName(self): #对象绑定方法
10 self.age = self.__class__.getnum()
测试类
带有__slots__Foo类的内置属性,__dict__不存在
(‘__slots__‘, [‘name‘, ‘age‘])#__slots__中的变量,类型为member,“成员”,类似C中的结构体
(‘age‘, )
(‘name‘, )
(‘group‘, ‘buluo‘) #类的普通变量不变
#方法不受影响
(‘changeName‘, )
(‘getnum‘, >)
带有__slots__Foo类的对象的内置属性
(‘__slots__‘, [‘name‘, ‘age‘]) #与普通类不同,在内置属性中并未带有属性,请查看上面“Foo对象的内置属性”中,包含了属性以及属性值
(‘changeName‘, >)
(‘getnum‘, >)
(‘group‘, ‘buluo‘) #类的属性不受影响
# 除了类的属性之外,私有属性并没有在对象的内置属性中出现,可见slots的类,去掉__dict__与私有方法,确实在内存中会节省一部分空间