美文网首页
Python基础17-面向对象(元类)

Python基础17-面向对象(元类)

作者: Jacob_LJ | 来源:发表于2018-05-19 01:34 被阅读13次

Python基础-面向对象(元类)

1 metaclass 元类

1.1 创建类对象的类,即为元类

当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。
连接起来就是:先定义metaclass,就可以创建类,最后创建实例。
所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。

1.2 追查类对象的__class__指向的值

元类的对应的 class 就是 type

num = 10
print(num.__class__) # <class 'int'>


s = "abc"
print(s.__class__) # <class 'str'>


class Person:
    pass

p = Person()
print(p.__class__) # <class '__main__.Person'>


print("-"*20)


print(int.__class__)
# print(num.__class__.__class__)

print(str.__class__)

print(Person.__class__)
print(Person.__class__.__class__)
print(type.__class__)

>>> 打印结果
<class 'int'>
<class 'str'>
<class '__main__.Person'>
--------------------
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>

1.3 对象及类的结构图:

2 类对象的创建

2.1 通常使用 class 声明创建类对象(编译器工作)

class Person:
    count = 0
    def run(self):
        pass

2.2 手动创建类对象

  • 之前,我们使用过 type() 来查看一个对象的类型
type("abc")
  • 通过 type() 方法手动创建类对象
def run(self):
    print("---", self)

xxx = type("Dog",(),{"count": 0, "run": run})# Dog 是类名,xxx 是类变量;相对于前面, Person既是类名也是类变量
print(xxx)

print(xxx.__dict__)

d = xxx()
print(d)

d.run()

>>> 结果
<class '__main__.Dog'>
{'count': 0, 'run': <function run at 0x1054edbf8>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
<__main__.Dog object at 0x1054f0ac8>
--- <__main__.Dog object at 0x1054f0ac8>

3 类对象创建时,元类的查找机制

类的创建流程:

  1. 检测类中是否有明确 __metaclass__属性
    有, 则通过指定元类来创建这个类对象
# 在类名后面括号内指定
class Dog(Animal):
    pass

或

# 在类代码体内通过 \_\_metaclass\_\_ 属性进行指定
class Dog():
    __metaclass__ =  Animal
    pass
  1. 检测父类中是否存在 __metaclass__属性
    有, 则通过指定元类来创建这个类对象
class Animal:
    __metaclass__ = xxx
    pass
  1. 检测模块中是否存在 __metaclass__属性
    有, 则通过指定元类来创建这个类对象
# 模块就是当前文件中有没有写上下面代码,注意,不能写在 类代码体内、函数体内等等
__metaclass__ = xxx
  1. 通过内置的type这个元类,来创建这个类对象

注意:动态变化类型时的拦截时机有3个(前三步)以及作用范围的不同

4 类的描述

class Person:
    """
    关于这个类的描述, 类的作用, 类的构造函数等等; 类属性的描述
    Attributes:
        count: int 属性意义
    """
    count = 1

    def run(self, distance, step):
        """
        这个方法的作用描述
        :param distance: 参数的含义, 参数的类型int, 是否有默认值
        :param step:
        :return: 返回的结果的含义(时间), 返回数据的类型int
        """
        print("人在跑")
        return distance / step

# 通过 help 打印该类描述,pycharm 会自动生成一定的格式描述
help(Person)

>>> 结果


Help on class Person in module __main__:

class Person(builtins.object)
 |  关于这个类的描述, 类的作用, 类的构造函数等等; 类属性的描述
 |  Attributes:
 |      count: int 属性意义
 |  
 |  Methods defined here:
 |  
 |  run(self, distance, step)
 |      这个方法的作用描述
 |      :param distance: 参数的含义, 参数的类型int, 是否有默认值
 |      :param step:
 |      :return: 返回的结果的含义(时间), 返回数据的类型int
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  count = 1


Process finished with exit code 0

5 项目文档的生成

5.1 方式一:使用内置模块 pydoc

具体步骤:

  1. cd 进入对应工程目录下
  2. python3 --help 查看python3可用参数使用说明
  3. 找到 -m 参数,通过 -m 可以通过脚本形式运行一个库模块
  4. 查看 pydoc 模块使用说明,python3 -m pydoc -h
  5. 按如下参数,使用 pydoc
  • 查看文档描述:python3 -m pydoc 模块名称
  • 启动本地服务, 浏览文档:python3 -m pydoc -p 1234
  • 生成指定模块html文档:python3 -m pydoc -w 模块名称

5.2 方式二:借助其他三方库

  • doxygen
  • epydoc
  • Sphinx

相关文章

  • Python基础17-面向对象(元类)

    1 metaclass 元类 1.1 创建类对象的类,即为元类 当我们定义了类以后,就可以根据这个类创建出实例,所...

  • Python面向对象(基础)

    面向对象 Python是支持面向对象的,面向对象编程是一种程序设计思想。 类和实例(基础) 面向对象最重要的就是类...

  • 29.Python之面向对象的元类

    Python之面向对象的元类 什么是元类?类的类就是元类,元类创建对象。使用class定义的类,用来产生程序员自己...

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • 2018-07-31Python (11)

    python 基础语法(11) 面向对象 概念 面向对象最重要的概念就是类和实例,类是实例的抽象,而实例是类的具象...

  • 三、python面向对象

    1.面向对象基础 类和对象(类和实例) 其实python面向对象的概念和c++、java等高级语言没什么区别,只是...

  • Python面向对象之访问控制!

    回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,...

  • Python OOP-1

    0. OOP-Python面向对象 Python面向对象 面向对象编程基础公有私有继承组合,Mixin 魔法函数魔...

  • Python精简入门学习(十四)

    Python精简入门学习之面向对象(oop) -面向对象 -类和对象

  • 007-类和对象

    Java - 强制面向对象 类 Python - 既支持面向对象,也支持面向过程 1、类、对象 类是对某一类具有共...

网友评论

      本文标题:Python基础17-面向对象(元类)

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