美文网首页
面向对象进阶

面向对象进阶

作者: 97833632c0c7 | 来源:发表于2018-06-15 10:28 被阅读0次

    ### 动态添加属性:

    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)

        ```

    相关文章

      网友评论

          本文标题:面向对象进阶

          本文链接:https://www.haomeiwen.com/subject/vvvmjftx.html