### 动态添加属性:
1. `对象.属性名=xx`的形式。
2. 通过`setattr(对象,属性名,这个属性对应的值)`来添加。
### 动态添加实例方法:
使用`types.MethodType`来添加。并且这个函数中要有self作为第一个参数。
### 动态添加类方法:
动态添加类方法比较简单,直接将类对象添加一个属性,指向一个函数就可以了。但是这个函数必须使用`@classmethod`来进行装饰。并且这个函数的第一个参数必须是`cls`。
### 动态添加静态方法:
动态添加静态方法也比较简单,直接将这个类对象添加一个属性,并将这个属性指向一个函数就可以了。但是这个函数必须使用`@staticmethod`来进行装饰。并且这个函数不需要传递`self`和`cls`这些参数,因为她只是一个静态方法而已。
### 删除属性:
1. `del 对象.属性名`。
2. `delattr(对象,属性名)`
### `__slots__`魔术变量:
用来限制一个类中,只能添加指定的属性。
这个魔术变量只能在新式类中才能用,在旧式类中不能使用。
### 类也是对象:
在Python中,一切皆为对象。包括类。类是使用元类创建的。
### 动态的创建类:
使用`type`函数可以动态创建类:`type(类名,父类的元组,这个类的属性以及对应值的字典)`
### 什么是元类:
元类总而言之一句话,就是用来创建类对象的。
### 创建自己的元类:
在`Python2`中,如果要指定这个类的元类,应该修改`__metaclass__`魔术变量。
在`Python3`中,如果要指定这个类的元类,应该在类定义的头部,指定`metaclass=xxx`
1. 使用函数的形式:
```python
# 元类会自动将你通常传给‘type’的参数作为自己的参数传入
def upper_attr(future_class_name, future_class_parents, future_class_attr):
'''返回一个类对象,将属性都转为大写形式'''
# 选择所有不以'__'开头的属性
attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
# 将它们转为大写形式
uppercase_attr = dict((name.upper(), value) for name, value in attrs)
# 通过'type'来做类对象的创建
return type(future_class_name, future_class_parents, uppercase_attr)
class Foo(object):
__metaclass__ = upper_attr
bar = 'bip'
```
2. 使用类的形式:
```python
class UpperAttrMetaclass(type):
def __new__(cls, name, bases, dct):
attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
uppercase_attr = dict((name.upper(), value) for name, value in attrs)
return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr)
```