【python进阶】详解元类及其应用1

简介: 【python进阶】详解元类及其应用1

前言

元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~

1. 类也是对象

在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对象的代码段。在 Python中这⼀点仍然成⽴:

>>> class ObjectCreator(object): 
…          pass 
>>>my_object = ObjectCreator() 
>>>print(my_object)
<__main__.ObjectCreator object at 0x8974f2c>

但是,Python中的类还远不⽌如此。类同样也是⼀种对象。是的,没错,就是对象。只要你使⽤关键字class,Python解释器在执⾏的时候就会创建⼀个 对象。

下⾯的代码段:

>>> class ObjectCreator(object):
...     pass
...

将在内存中创建⼀个对象,名字就是ObjectCreator。这个对象(类对象 ObjectCreator)拥有创建对象(实例对象)的能⼒。但是,它的本质仍然是 ⼀个对象,于是乎你可以对它做如下的操作:


1. 你可以将它赋值给⼀个变量

2. 你可以拷⻉它

3. 你可以为它增加属性

4. 你可以将它作为函数参数进⾏传递

下⾯是示例:

>>>    print(ObjectCreator)#你可以打印⼀个类,因为它其实也是⼀个对象 
<class    '__main__.ObjectCreator'> 
>>>    def    echo(o):
...        print(o)
... 
>>>    echo(ObjectCreator)#你可以将类做为参数传给函数 
<class    '__main__.ObjectCreator'> 
>>>    print(hasattr(ObjectCreator,'new_attribute'))
False 
>>>ObjectCreator.new_attribute='foo'#你可以为类增加属性 
>>>print(hasattr(ObjectCreator,    'new_attribute'))
True 
>>>print(ObjectCreator.new_attribute)
foo 
>>>ObjectCreatorMirror=ObjectCreator#你可以将类赋值给⼀个变量 
>>>print(ObjectCreatorMirror())
<__main__.ObjectCreator    object at 0x8997b4c>


2. 动态地创建类


因为类也是对象,你可以在运⾏时动态的创建它们,就像其他任何对象⼀样。⾸先,你可以在函数中创建类,使⽤class关键字即可。

>>> def choose_class(name):
...:    if name == 'foo':
...:        class Foo(object):
...:            pass
...:        return Foo #返回的是类,不是类的实例
...:    else:
...:        class Bar(object):
...:            pass
...:        return Bar
...:
>>> MyClass=choose_class('foo')
>>> print(MyClass)#函数返回的是类,不是类的实例
<class '__main__.choose_class.<locals>.Foo'>
>>> print(MyClass())#你可以通过这个类创建类实例,也就是对象
<__main__.choose_class.<locals>.Foo object at 0x000001C54F7007B8>

但这还不够动态,因为你仍然需要⾃⼰编写整个类的代码。由于类也是对 象,所以它们必须是通过什么东⻄来⽣成的才对。当你使⽤class关键字时, Python解释器⾃动创建这个对象。但就和Python中的⼤多数事情⼀样, Python仍然提供给你⼿动处理的⽅法。

还记得内建函数type吗?这个古⽼但强⼤的函数能够让你知道⼀个对象的类 型是什么,就像这样:

>>> print(type(1))#数值的类型
<class 'int'>
>>> print(type("1"))#字符串的类型
<class 'str'>
>>> print(type(ObjectCreator()))#实例对象的类型
<class '__main__.ObjectCreator'> 
>>>    print(type(ObjectCreator))#类的类型 
<type 'type'>

仔细观察上⾯的运⾏结果,发现使⽤type对ObjectCreator查看类型是,答案 为type, 是不是有些惊讶。。。看下⾯

3. 使⽤type创建类

type还有⼀种完全不同的功能,动态的创建类。

type可以接受⼀个类的描述作为参数,然后返回⼀个类。(要知道,根据传入参数的不同,同⼀个函数拥有两种完全不同的⽤法是⼀件很傻的事情,但 这在Python中是为了保持向后兼容性)

type可以像这样⼯作:

type(类名, 由⽗类名称组成的元组(针对继承的情况,可以为空),包含属 性的字典(名称和值))

⽐如下⾯的代码:

In [7]: class Test:#定义了⼀个Test类
   ...:     pass
   ...:
In [8]: Test()#创建了⼀个Test类的实例对象
Out[8]: <__main__.Test at 0x1c54f648518>

可以⼿动像这样创建:

In [9]: Test2 = type("Test2",(),{})#定义了⼀个Test2类
In [10]: Test2()#创建了⼀个Test2类的实例对象
Out[10]: <__main__.Test2 at 0x1c54f66ed68>

我们使⽤"Test2"作为类名,并且也可以把它当做⼀个变量来作为类的引⽤。 类和变量是不同的,这⾥没有任何理由把事情弄的复杂。即type函数中第1个实参,也可以叫做其他的名字,这个名字表示类的名字

In [11]: MyDogClass = type('MyDog',(),{})
In [12]: print(MyDogClass)
<class '__main__.MyDog'>

使⽤help来测试这2个类

In [13]: help(Test)#⽤help查看Test类
Help on class Test in module __main__:
class Test(builtins.object)
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)
In [14]: help(Test2)#⽤help查看Test2类
Help on class Test2 in module __main__:
class Test2(builtins.object)
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

4.使⽤type创建带有属性的类

type 接受⼀个字典来为类定义属性,因此

In [15]: Foo = type('Foo',(),{'bar':True})

可以翻译为:

In [16]: class Foo(object):
    ...:     bar = True

并且可以将Foo当成⼀个普通的类⼀样使⽤:

In [17]: print(Foo)
<class '__main__.Foo'>
In [18]: print(Foo.bar)
True
In [19]: f = Foo()
In [20]: print(f)
<__main__.Foo object at 0x000001C54F6511D0>
In [21]: print(f.bar)
True

当然,你可以向这个类继承,所以,如下的代码:

In [22]: class FooChild(Foo):
    ...:     pass

就可以写成:

In [23]: FooChild = type('FooChild',(Foo,),{})
In [24]: print(FooChild)
<class '__main__.FooChild'>
In [25]: print(FooChild.bar)
True

注意:

  • type的第2个参数,元组中是⽗类的名字,⽽不是字符串
  • 添加的属性是类属性,并不是实例属性
目录
相关文章
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
78 3
|
10天前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
57 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
1月前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
42 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索未来编程:Python在人工智能领域的深度应用与前景###
本文将深入探讨Python语言在人工智能(AI)领域的广泛应用,从基础原理到前沿实践,揭示其如何成为推动AI技术创新的关键力量。通过分析Python的简洁性、灵活性以及丰富的库支持,展现其在机器学习、深度学习、自然语言处理等子领域的卓越贡献,并展望Python在未来AI发展中的核心地位与潜在变革。 ###
|
13天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
49 0
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
Python进阶系列(十八)
Python进阶系列(十八)
|
测试技术 Python
Python进阶系列(十七)
Python进阶系列(十七)
|
存储 缓存 Python
Python进阶系列(十六)
Python进阶系列(十六)