28.Python中的type和类的生成 您所在的位置:网站首页 大大的成语地名叫什么 28.Python中的type和类的生成

28.Python中的type和类的生成

2022-05-31 15:05| 来源: 网络整理| 查看: 265

《Python编程的术与道:Python语言进阶》视频课程 《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618

type和类的生成

在本节中,当定义类或创建类的实例时,我们要更加深入地了解其幕后发生的事情。

首先,我们讨论type和类之间的关系。

类是如何产生的

type通常的用法是判断对象的类型,但除此之外,它最大的用途是来动态的创建类。当Python扫描到class语法的时候,就会调用type函数进行类的创建。

表面上使用继承创建一个类,所有类都直接或间接继承于object。而真正创建类的是type。

将type应用于一个对象将返回一个类(该对象是这个类的实例):

x = [4, 5, 9] y = "Hello" print(type(x), type(y))

在一个类的名称上应用type,则返回type类。

print(type(list), type(str))

这类似于在type(x)上再应用type:

x = [4, 5, 9] y = "Hello" print(type(x), type(y)) print(type(type(x)), type(type(y)))

一个用户定义的类(或object类)是一个type类的实例。 因此,我们可以看到,类是根据type创建的。

我们可以创建从type类继承的类。

type使用三个参数来调用:

type(classname, superclasses, attributes_dict)

如果用三个参数调用type,它将返回一个新的type对象。 这为我们提供了动态形式的class语句。

classname是定义类名称的字符串,并成为name属性;superclasses是包含我们类的超类的列表或元组。 该列表或元组将成为bases属性;attribute_dict是一个字典,用作我们类的名称空间。 它包含类主体的定义,并成为dict属性。绑定的方法或属性以dict的形式传入。

一个简单类的定义:

class A: pass x = A() print(type(x))

我们也可以使用 “type” 来进行这个类的定义:

A = type("A", (), {}) x = A() print(type(x))

一般来说,这意味着我们可以如此定义一个类:

type(classname, superclasses, attributedict)

当我们调用"type"时,将调用type的方法。 调用方法运行另外两个方法:new和init:

type.__new__(typeclass, classname, superclasses, attributedict)

type.__init__(cls, classname, superclasses, attributedict)

new方法创建并返回新的类对象,然后init方法初始化新创建的对象。

class Robot: counter = 0 def __init__(self, name): self.name = name def sayHello(self): return "Hi, I am " + self.name def Rob_init(self, name): self.name = name Robot2 = type("Robot2", (), {"counter":0, "__init__": Rob_init, "sayHello": lambda self: "Hi, I am " + self.name}) x = Robot2("Marvin") print(x.name) print(x.sayHello()) Marvin Hi, I am Marvin y = Robot("Marvin") print(y.name) print(y.sayHello()) Marvin Hi, I am Marvin print(x.__dict__) print(y.__dict__) {'name': 'Marvin'} {'name': 'Marvin'}

Robot和Robot2的类定义在语法上完全不同,但是它们在逻辑上实现相同的类。

Python在第一个示例中实际执行的操作(即定义类的通常方式)如下:Python处理Robot类的完整类声明以收集Robot的方法和属性,并将其添加到类型调用的attribute_dict中 。 因此,Python将以与Robot2中相似或相同的方式来调用type。

Python中的object和type

在这里插入图片描述

type和object是特殊的,它们是type层次结构的基础。 一切都是object的实例。 每个type/class都是type的实例。 所以type是object的实例,而object也是type的实例。

这意味着继承关系不能真正表示为树,因为存在一个循环:type和object是彼此的实例。这种相互继承通常是不可能的,但这就是Python中这些基本类型的方式:它们违反了通常的规则。

类是用来创建对象的模板,那么,元类就是创建类的模板。type就是一个元类。object也是由type创建的。type自己也是type创建的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有