动态编程语言是高级语言设计的一中类型,常见的动态编程语言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)
<ipython-input-49-33a40e3d7168> in <module>()
----> 1 xiaoming.addr='shenzhen'
AttributeError: 'man' object has no attribute 'addr'
In [50]: man.addr='beijing' #能访问该类的类属性
In [51]: print(xiaoming.addr)
beijing