欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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