动态添加属性
属性不是在类定义的时候添加的,而是在程序运行过程中添加的,我们首先定义一个类:
class Person(object):
"""
定义一个人的类
"""
country = 'China'
def __init__(self,name):
self.name = name
p = Person('liming')
动态添加属性第一种方法:
p.age = 18
第二种为使用setattr()函数添加:
setattr(p,'age',18)
#三个参数分别为需要设置属性的对象,属性的名称(字符串)以及属性的值
为了在动态添加属性之前判断是否已经存在了这个属性,我们可以使用hasattr()进行判断:
if hasattr(p,'age'):
#第一个参数为对象名,第二个参数为属性名(字符串)
print("True")
else:
print('False')
#True
动态添加方法
动态添加实例方法
不是在类创建的过程中添加的方法,而是在创建完成一个实例化对象的时候为对象添加一个方法,需要使用types.MethodType。
import types
def run(self):
print("%s在奔跑" % self.name)
p.run = types.MethodType(run,p)
#第一个参数是要添加的方法,第二个参数是对象
p.run()
#liming在奔跑
动态添加类方法
在运行过程中给类添加一个方法。
@classmethod
def greet(cls):
print('I come from %s' % cls.country)
Person.greet = greet
Person.greet()
#I come from China
动态添加静态方法。
@staticmethod
def sleep():
print('sleeping')
Person.sleep = sleep
Person.sleep()
#sleeping
动态删除属性和方法
删除属性和方法一共有两种方式:
1.del 对象.属性名
2. delattr(对象,‘属性名’)
del p.name
delattr(p,'run')
__slots__魔术变量
可以用__slots__指定一些属性名,只有被指定的属性名同名的属性以后才可以动态添加。
class student(object):
__slots__ = ('name','run','age','country')
#由于初始化函数中使用到了name,所以__slots__中必须添加name
def __init__(self,name):
self.name = name
s = student('xiaohong')
setattr(s,'age',18)
s.run = run
s.height = 170
#报错