面向对象进阶

### 动态添加属性:

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)

    ```

你可能感兴趣的:(面向对象进阶)