美文网首页
面向对象进阶

面向对象进阶

作者: 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)

    ```

相关文章

  • 面向对象进阶

    decorotor - 装饰器/包装器 @property装饰器 之前我们讨论过Python中属性和方法访问权限的...

  • 面向对象进阶

    ### 动态添加属性: 1. `对象.属性名=xx`的形式。 2. 通过`setattr(对象,属性名,这个属性对...

  • 面向对象进阶

    isinstance 检测对象与类之间的关系print(isinstance(a,A))print(isinsta...

  • 面向对象进阶

    1. 抽象类和抽象方法 抽象类:使用abstract修饰的类,包含抽象方法的类必须是抽象类,但抽象类不一定包含抽象...

  • 5.1-面向对象的特征(一)继承 | 上

    原作者:无缘原博客链接:5.1-面向对象的特征(一)继承 | 上 JAVA面向对象进阶 本章重点针对面向对象的三大...

  • [JAVA]面向对象的三大特性

    学习Java的进阶过程,是理解面向对象的思想,掌握面向对象的基本原则以及Java面向对象基本实现原理,熟练使用封装...

  • JS基础到高级

    JS高级-进阶目录======================基础Web API面向对象编程继承函数进阶正则表达式...

  • 17、python面向对象进阶

    面向对象进阶 isinstance和issubclass isinstance(obj,cls)检查是否obj是否...

  • 面向对象编程进阶

    前言 我们在了解面向对象的入门知识,知道如何定义一个类和对象的时候,我们应该向它更深的知识进行拓展。 @prope...

  • 面向对象编程进阶

    可见性和属性装饰器在很多面向对象编程语言中,对象的属性通常会被设置为私有(private)或受保护(protect...

网友评论

      本文标题:面向对象进阶

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