Python动态添加属性和方法

动态添加属性,就是这个属性不是在类定义的时候添加的,而是在程序运行过程中添加的,动态添加属性有两种方法,第一个是直接通过对象名.属性名,第二个是通过setattr添加:
1、第一种:使用对象.属性名添加:

p.ageb= 18

2、第二种,使用setattr函数添加:

class Person:
    def __init__(self, name):
        self.name = name

p = Person('lyc')
p.age = 18
if not hasattr(p, ’sex’):
    setattr(p, 'sex', 'male')
print(p.sex)

· 动态添加方法
动态添加实例方法:
动态添加方法,意思是方法不是在类定义的时候添加的。而是创建完这个对象后,在运行的时候添加的。如果想要在运行的时候添加方法,这时候就应该使用到types.MethodType这个方法了,示例:

import types
class Person:
    def __init__(self, name):
        self.name = name

def run(self):
    print('%s run func' % self.name)

p1 = Person('lyc')
p1.run = types.MethodType(run, p1) #这里p1为run方法的参数, 即self
p1.run()

动态添加类方法:
添加类方法,是把这个方法添加给类。因此添加类方法的时候不是给对象添加,而是给类添加。并且添加类方法的时候不需要使用types.MethodType,直接将这个函数赋值给类就可以了,但是需要使用classmethod装饰器将这个方法设置为一个类方法。

@classmethod
def show(cls):
    print('这是类方法')

Person.show = show
Person.show()

动态添加静态方法:

@classmethod
def show(cls):
    print('这是类方法')

Person.show = show
Person.show()
·  动态删除属性和方法
1、del 对象.属性名
print(p1.name)
del p1.name
print(p1.name)
2、delattr(对象,“属性名”)
print(p1.name)
del p1.name
print(p1.name)

魔术方法__slots__:
使用__slots__来指定类中允许添加的属性,如下只能添加 name,和age这两个属性

class Person:
    __slots__ = ('name', 'age')
    def __init__(self, name):
        self.name = name

p2 = Person('lyc')
p2.age = 18
print(p2.age)
#下边代码会报错
p2.country = 'zh'

你可能感兴趣的:(python)