python核心编程(元类)

本文围绕Python编程展开,介绍了类也是对象,可对其进行赋值、拷贝等操作;阐述了动态创建类的方法,包括在函数中创建及用type创建;详细说明了用type创建简单类、带属性类、带继承类和带方法类;还讲解了元类概念及__metaclass__属性的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类也是对象

在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段
在这里插入图片描述
但是,Python中的类还远不止如此。类同样也是一种对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。
以上的代码将在内存中创建一个对象,名字为Person,这个对象(类对象Person)拥有创建对象(实例对象)的能力。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:

  1. 你可以将它赋值给一个变量
  2. 你可以拷贝它
  3. 你可以为它增加属性
  4. 你可以将它作为函数参数进行传递

在这里插入图片描述

动态地创建类

因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。在这里插入图片描述
但这还不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。当你使用class关键字时,Python解释器自动创建这个对象。但就和Python中的大多数事情一样,Python仍然提供给你手动处理的方法。

使用type创建类

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

type可以接受一个类的描述作为参数,然后返回一个类。

type可以像这样工作:

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

创建简单的类

在这里插入图片描述

创建带有属性的类

在这里插入图片描述

创建带有继承的类

在这里插入图片描述

创建带有方法的类

class Father:
    pass

def func():
    print('hello')

a = type("Children",(Father,),{"func":func})
a.func()

什么是元类

从上面的例子可知,元类就是用来创建类的“东西”,元类就是类的类
type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。Python中所有的东西,注意,我是指所有的东西——都是对象这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。

age = 18
print(age.__class__)
print(age.__class__.__class__)

name = 'jack'
print(name.__class__)
print(name.__class__.__class__)

def run():
    pass
print(run.__class__)
print(run.__class__.__class__)

class Person:
    pass
a = Person()
print(a.__class__)
print(a.__class__.__class__)

在这里插入图片描述

__metaclass__属性

你可以在定义一个类的时候为其添加__metaclass__属性

class Foo(object):
    __metaclass__ = something

如果你这么做了,Python就会用元类来创建类Foo。小心点,这里面有些技巧。你首先写下class Foo(object),但是类Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类。

class Foo(Bar):
    pass

上面的这段代码,python做了如下操作:

  1. Foo中有__metaclass__这个属性吗?如果是,Python会通过__metaclass__创建一个名字为Foo的类(对象)
  2. 如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。
  3. 如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。
  4. 如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值