一、动态属性与__slots__
python对象可以动态的添加方法,但是这种添加的方法仅对当前对象有效,例如:
class Cat():
def __init__(self, name):
self.name = name
def walk_fun(self):
print('自定义方法,名字是%s' % self.name)
c1 = Cat('aaa')
c2 = Cat('bbb')
#动态绑定方法
Cat.walk = walk_fun
c1.walk()
c2.walk()
这种添加动态方法的方式很方便,但是类可能会被后续修改,带来程序的不确定性。因此python提供__slots__方法来限制可添加的动态属性和方法
class Cat():
#限制可添加的属性方法
__slots__ = ('walk', 'name')
def __init__(self, name):
self.name = name
c1 = Cat('aaa')
#绑定方法
from types import MethodType
c1.walk = MethodType(lambda self: print('自定义方法,名字是%s' % self.name), c1)
c1.walk()
#c1.age = 22 #报未知属性错误
__slots__仅限制对象添加动态属性和方法,依然可以通过类直接动态添加属性和方法,同时__slots__对派生字类也不起作用。
二、使用type()函数定义类
type(className, (class1, class2, …), dict(key1 = fun, key2 = name, …))函数定义类有三个参数: