python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法
程序员文章站
2022-06-30 15:26:08
给对象添加实例属性,可以直接这样 t.age = 18 ( 假设 t = Test() ) 给类添加类属性 , 也可以直接这样 Test.age = 18 那给对象添加实例方法,可以在类外面先定义一个函数 然后 用 types.MethodType() 方法 把 函数绑定到对象的一个属性上面: 这个 ......
给对象添加实例属性,可以直接这样 t.age = 18 ( 假设 t = Test() ) 给类添加类属性 , 也可以直接这样 Test.age = 18
那给对象添加实例方法,可以在类外面先定义一个函数 然后 用 types.MethodType() 方法 把 函数绑定到对象的一个属性上面:
class Test(object): def __init__(self, newName): self.name = newName def printName(self): print('输出名字------%s----' %self.name) t = Test('Jack') t.printName = types.MethodType(printName, t) t.printName() >>>输出名字------Jack----
这个地方的 t.printName 其实并不是一个方法, 而是存储了 printName 函数的引用, types.MethodType() 的作用是把 函数的self 变成 t ,所以打印的是 t.name .
给类添加静态方法,也是先在外边定义一个静态方法,然后直接一个类属性指向这个静态方法就可以 :
class Test(object): def __init__(self, newName): self.name = newName @staticmethod def printName(): print('输出名字------111----') Test.printName = printName Test.printName() >>>输出名字------111----
因为静态方法一般不需要参数,所以直接一个类属性 Test.printName 指向这个静态方法就行.
同理,给类添加类方法和添加静态方法差不多:
class Test(object): a = 100 def __init__(self, newName): self.name = newName @classmethod def printName(cls): print('输出名字------%s----' % cls.a) Test.printName = printName Test.printName() >>>输出名字------100----
只不过 在调用类方法的时候会自动的把类的名字传递给后来添加上的类方法, 所以 cls.a 就是 Test.a