Python是动态语言,动态类型语言,也是强类型语言。因此Python能够在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。swift
class Obj(object): def __init__(self): self.name = '张亚飞' obj = Obj() obj.age = 23 print(obj.age) obj2 = Obj() print(obj2.age)
由以上代码可知,Obj类有两个属性:name和age。经过[对象名.属性名]给类对象obj动态添加了对象属性addr,而Obj的另外一个类对象obj2却不能调用这个属性。 注:经过对象名添加的对象属性,只有这个对象能使用
Obj.score = 100 print(obj.score) print(obj2.score)
类中有三种方法,实例方法,静态方法和类方法,三种方法的区别以下:
实例方法:须要绑定要一个对象上,第一个参数默认使用self,会把对象做为第一个参数传递进来
静态方法:使用装饰器@staticmethod进行定义,类和对象均可以调用,不须要默认参数
类方法:使用装饰器@classmethod进行定义,类和对象均可以调用,第一个参数默认使用cls,会把类做为第一个参数传递进来函数
from types import MethodType class Obj(object): # __slots__ = ('name', 'age') def __init__(self): self.name = '张亚飞' def set_score(self, score): self.score = score @staticmethod def static_func(): print('static_func') @classmethod def class_func(cls): print('class_method') “““ 类中有三种方法,实例方法,静态方法和类方法,三种方法的区别以下: 实例方法:须要绑定要一个对象上,第一个参数默认使用self,会把对象做为第一个参数传递进来 静态方法:使用装饰器@staticmethod进行定义,类和对象均可以调用,不须要默认参数 类方法:使用装饰器@classmethod进行定义,类和对象均可以调用,第一个参数默认使用cls,会把类做为第一个参数传递进来 ””” # 动态添加实例方法
obj = Obj()
obj.set_score = MethodType(set_score, obj) obj.set_score(99) print(obj.score) # 99
obj2.set_score(99) # AttributeError: 'Obj' object has no attribute 'set_score'
""" 由以上代码可知,Obj类有一个方法:eat()方法。经过[types.MethodType(方法名, 对象名)]给类对象zhangsan动态添加了对象方法run(),同理,Obj的另外一个类对象lisi不能调用这个方法 注:经过对象名添加的对象方法,只有这个对象能使用 """ # 添加静态方法 Obj.static_func = static_func Obj.static_func() obj.static_func()
obj2.static_func() """ 由以上代码可知,经过[类名.静态方法名]给类Obj动态添加了静态方法static_func(),Obj类的Obj对象和obj2对象都能调用这个方法 注:经过类名添加的静态方法,这个类及这个类的全部对象都能使用 """ # 添加类方法 Obj.class_func = class_func Obj.class_func() obj.class_func()
obj2.class_func() """ 由以上代码可知,经过[类名.类方法名]给类Obj动态添加了类方法class_func(),Obj类的obj对象和obj2对象都能调用这个方法 注:经过类名添加的类方法,这个类及这个类的全部对象都能使用 """
经过以上内容,咱们知道了如何动态的添加属性和方法。可是,若是咱们想要限制class的属性该怎么办?例如:只容许Obj实例添加name和age属性。为了达到这个目的,Python容许在定义class的时候,定义一个特殊变量__slots__来限制该class能添加的属性。spa
class Obj(object): __slots__ = ('name', 'age')
obj = Obj() obj.name = 'zhangyafei' obj.age = 23 obj.score = 99 # AttributeError: 'Obj' object has no attribute 'score' Obj.score = 100 print(obj.score) # 100 obj.score = 99 # AttributeError: 'Obj' object attribute 'score' is read-only
经过以上代码可知,__slots__对Obj类的动态添加没有限制,而Obj类对象obj不能再动态添加对象属性和方法。code
对于__slot__有如下几个须要注意的地方:对象