python内置属性类_python中类的内置属性初探

首先,建立一个类,并用该类创建一个对象,分别查看object,类与对象的内置属性

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

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):

实例类

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

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__将属性固定

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

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__与私有方法,确实在内存中会节省一部分空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值