python动态创建对象属性_python动态添加属性

动态编程语言是高级语言设计的一中类型,常见的动态编程语言javascript/php/Ruby,而C/c++/C#则不属于动态语言

定义时不包含某些属性,运行时添加某些属性

1.添加动态属性

class Test(object):

pass

dir(Test) # 与dir(object)一样

t=Test()

t.addr=4 # 动态添加实例属性

Test.addr=5 #动态添加类属性

--------------------------------------------------

2.动态添加实例方法

class person(object):

def __init__(self,name):

self.name=name

def eat(self):

print('%s 正在吃'%name)

def sleep(self):

print('%s正在睡觉'%name)

p=Person("wang")

p.sleep=sleep

p.sleep() #报错 ,原因是p的对象虽然指向了def sleep函数,但是p并没有当做sleep方法中的self实参,即缺少参数,故动态添加方法与动态添加属性不是一样的

#正确方法

import types

p.sleep=types.MethodType(sleep,p)

3.添加静态方法

@staticmethod

def test():

print('-----static method')

p.test=test

p.test()

p.xxx=test

p.xxx()

4.添加类方法

@classmethod

def test(cls):

print('----class method')

p.printmethod=test

p.printmethod()

总之:动态向类动态添加类属性,类方法,静态方法操作一样的,直接赋值指向

但添加类实例方法是不同

__ slots__控制类中属性访问范围

非动态语言访问类的属性都是在类的定义时就已经明确了,python属于动态语言,后期可以动态添加类的属性,但是对类的属性管理就可能混乱,slots能很好的控制实例属性的访问

In [46]: class man(object):

__slots__=('name')

In [47]: xiaoming=man()

In [48]: xiaoming.name='xiaoming'

In [49]: xiaoming.addr='shenzhen' #限制实例访问,不能访问该类的实例属性

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

in ()

----> 1 xiaoming.addr='shenzhen'

AttributeError: 'man' object has no attribute 'addr'

In [50]: man.addr='beijing' #能访问该类的类属性

In [51]: print(xiaoming.addr)

beijing

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值