【Python】对象、类、元类

龟叔发明了Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。
这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念,它是Python世界中的造物主,虽然我们很少去直接使用它,但天天都在用,它就是今天的主角--元类。
要搞懂元类,我们还是先从对象说起。

对象(Object)

Python中一切皆对象,这句话你一定有听说过(现在你就听说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:

i=10
s='abc'
nums=[1,2,3]
dicts={"name":"zeng"}

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。
标识
标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数 id()可以查看对象的ID标识。

print("对象的唯一标识为:"+str(id(i)))
对象的唯一标识为:1704834400
print("对象的唯一标识为:"+str(id(dicts)))
对象的唯一标识为:1918903679592

对象值
对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。
类型
对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的。
比如上面i的类型是int类型,s的类型是字符串类型,nums的类型是列表类型,dicts的类型是字典类型,它们都是由对应的类型构建出来的。
通过type()可以查看对象的类型。

 

print("对象的类型为:"+str(type(i)))

 

print("对象的类型为:"+str(type(dicts)))
对象的类型为:<class 'int'>
对象的类型为:<class 'dict'>

对象的类型也和ID标识一样不会改变。唯一可能变的就是值。

除了系统已经定义好了的整数类型,字符串类型,列表等类型之外,我们还可以创建自己的类型,用关键字class来定义。例如:

 
 
class Person(object):#__init__()有点像构造函数,实例化类时调用def __init__(self,name,gender):#name是实例的属性self.name = nameself.gender = gender#live是类的属性live = True

这里的 Person 就是自定义类,类是一个抽象的模版,既不是指张三也不是李四等具体的人,现在我们可以通过调用这个类来构造(实例化)出一个具体的,实在的,有名字的对象出来,这个对象称之为实例对象(Instance)。

类与(实例)对象

 

 
p1 = Person ("zhangan","男")
print(p1.name)
p2 = Person ("lisi","女")
print(p2.name)
zhangan
lisi

这里的 p1、p2 就是实例化之后的(实例instance)对象,这两个对象的类型都是 Person 类,类与(实例)对象的关系就像一个车辆模具与一辆被造出来的真实车的关系一样。如下所示:

 

print(p1)
print(id(p1))
print(type(p1))
<__main__.Person object at 0x000002031271BBE0>
2212217600992
<class '__main__.Person'>

类也是对象(又叫类对象)

刚刚我们说了一切都是对象,实例(真实的车)是对象,类(模具车)当然也是对象,因为它也是实实在在存在的东西。

当 Python 解释器执行到关键字 class 这个指令的时候,在内部就会创建一个名为 “Person” 的类,这个类也是个对象,我们称之为类对象(注意区别实例对象),它一样有ID标识、有类型、有值。例如:

 

print(Person)
print(id(Person))
print(type(Person))
<class '__main__.Person'>
2446546123192
<class 'type'>

我们注意到Person这个类对象的类型叫“type”,也就是说Person类是由type创建出来的,现在你要记住,p1,p2 是实例对象,而Person是类对象,实例对象p1的类型是类对象Person,Person的类型是type。另外,这个type是什么鬼?

我们来回顾一下:

 

i=10
print("对象的类型为:"+str(type(i)))
print("对象的类型为:"+str(type(int)))
对象的类型为:<class 'int'>
对象的类型为:<class 'type'>

i的类型是int,int的类型也是type,所有类的类型都是type,也就是说所有的类都是由type创建的。这个type就是元类(metaclass),元类是用于创建类的类,道生一,一生二,三生万物,元类就是Python中的造物主。(元类自己也是对象)

现在我们都知道类(对象)可以使用class关键字创建,我们还知道类(对象)的类型是type,既然知道了它的类型是type,那么肯定可以通过type(元类)来创建。

用元类创建类

前面讲到过,type有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

 

Person1 = type("Person1", (), {"live":True})
print(Person1)

Person就是一个类,它等价于:

 

class Person1:live = True
print(Person1)
<class '__main__.Person1'>

用元类type创建类的语法是:

type(类名,父类元组(可以为空), 属性字典)

小结
Python中一切皆为对象,类是对象,元类也是对象,元类是用于创建类的类。


本文章参考公众号【python之禅】,非常感谢!
链接:https://mp.weixin.qq.com/s/UTFQgu4q5pHFyQZBWA9qpA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JETBRAINS开发工具中Translation翻译插件的使用

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xf…

【Python】pdfminer3k模块批量转换本地PDF文件

上一篇文章自己研究了一下如何批量将word或者ppt文件转换为PDF文件&#xff0c;但是有时候我们也想要将pdf文件转换为word或者txt文件&#xff0c;方便复制和处理。本文主要通过调用pdfminer3k模块进行处理。 说明&#xff1a;本文是在Windows10下使用python最新的3.6版本虚拟…

Python读写json文件的简单实现

转载自https://blog.csdn.net/vitaminc4/article/details/77985175 介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族的习惯(包括C、C、Java、Ja…

Nacos配置

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xf…

【Python】如何选择赋值和拷贝

在Python中&#xff0c;一切皆为对象&#xff0c;对象通过「变量名」引用&#xff0c;「变量名」更确切的叫法是「名字」&#xff0c;好比我们每个人都有自己的名字一样&#xff0c;我们通过名字来代指某个人&#xff0c;代码里面通过名字来指代某个对象。变量赋值就是给对象绑…

❤️震惊!人生苦短,我用python来玩田忌赛马❤️

一读标题笑死自己哈哈哈&#xff0c;最近猪哥&#xff08;玩得敲好的彭友&#xff09;找我帮忙解决他不会作业哈哈哈&#xff0c;他们公司自己出的笔试题哈哈哈&#xff0c;希望别被他们出题人看见哈哈哈&#xff0c;回想猪哥说的一句话&#xff0c;万一这就是以后你遇到的试题…

错误之data_insertt() takes 1 positional argument but 2 were given解决方法

1、首先检测函数与调用直接的参数是否匹配。 2、若为python环境。 函数定义如下&#xff1a; 调用如下&#xff1a; 显示如下错误&#xff1a; 解决方法&#xff1a;在函数定义时添加self。即为&#xff1a; 则问题解决。 这是一个很基本的&#xff0c;但是很严重的错误。只…

python将Unix时间戳转换成时间

将时间戳转换成时间 在时间戳转换成时间中&#xff0c;首先需要将时间戳转换成localtime&#xff0c;再转换成时间的具体格式&#xff1a; 利用localtime()函数将时间戳转化成localtime的格式利用strftime()函数重新格式化时间 #coding:UTF-8 import timetimestamp 15324990…

错误之Only one usage of each socket address (protocol/network address/port)解决办法

错误如下&#xff1a; 解决方案&#xff1a;这个错误是端口占用导致。我们应找到此应用程序对应端口号的pid然后kill掉&#xff0c;即可ok

【测试】用例设计思路-六方面

有这样一个面试题&#xff1a;在一个Web测试页面上&#xff0c;有一个输入框&#xff0c;一个计数器&#xff08;count&#xff09;按钮&#xff0c;用于计算一个文本字符串中字母a出现的个数。 请设计一系列测试用例用以测试这个Web页面。 有经验的测试人员可能会问面试官&…

Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

code: 1 #encodingutf-82 from django.db import models3 # Create your models here.4 class BookInfo(models.Model): #创建书本信息类&#xff0c;继承models.Model5 booktitlemodels.CharField(max_length20)6 bookdatamodels.DateField()7 class HeroInfo(model…

【Excel】函数DateDif查看两个日期之间的间隔

Excel中的DateDif函数是一个隐藏函数&#xff0c;在excel的公式以及帮助中是找不到的&#xff0c;必须要手工输入才可以。 此函数的格式为datedif&#xff08;"开始日期"&#xff0c;"结束日期"&#xff0c;"参数"&#xff09;&#xff0c;说明如…

【技巧】搜狗输入法特殊技巧

有时候我们报销或者其他情况下需要对金额进行大写&#xff0c;这时我们可以通过搜狗输入法进行转换;阅读的时候&#xff0c;我们会遇到一些特殊而且复杂的字&#xff0c;这个时候我们也可以通过搜狗输入法知道这个字怎么读。 先下载搜狗拼音输入法&#xff1a; 数字金额进行转换…

【商业】梳理你的商业模式

商业模式一直是一个好像每个人都能说两句&#xff0c;但是总也说不清楚的话题。 商业模式是企业的立身之本&#xff0c;也是企业的本质和核心。商业模式是人们商业智慧的集中体现&#xff0c;也是商业中最令人兴奋的部分。在商业模式的背后&#xff0c;有着太多的成功与失败、欢…

Django配置bootstrap

1、下载bootstrap文件。https://getbootstrap.com/docs/3.3/getting-started/ 下载的文件夹可以看出有css、fonts、js三个文件&#xff0c;这就是Bootstrap 3的全部 2、 自定义静态文件&#xff08;css&#xff0c;js&#xff0c;image&#xff09;位置 根目录下新建 static…

【Python爬虫】Windows环境下wxpy不需每次登陆重新扫描

有时候我们想每天向你女朋友或者某人发送一条信息&#xff08;通过线程控制或者每天自动任务&#xff09;;此外我们可以通过更改wxpy中Bot()中参数&#xff0c;保存缓存不用每次都扫描二维码。 以下代码来源于&#xff1a;http://www.cnblogs.com/botoo/p/8622379.html from …

Win10系统设置任务计划执行python脚本

上一篇文章说了通过Python中的wxpy在微信每天发送一条消息到女朋友或者某个人&#xff0c;通过线程方式每天发送次消息。 这里主要说如何通过window10自带的“任务计划程序”&#xff0c;每天在指定时间发送一条消息。 1. 首先通过windows 10系统左下角输入框输入“任务计划程…

【Word 】隐藏功能生成特殊线

有时候在用word进行文字处理时&#xff0c;有一些方法可以快速生成特殊的线&#xff0c;以下是具体的一些方法&#xff1a; 1.输入3个“”&#xff0c;再按回车键Enter&#xff0c;生成一条双直线 2.输入3个“~~~”&#xff0c;再按回车键Enter&#xff0c;生成一条波浪线 3.输…

Django - - - -视图层之视图函数(views)

阅读目录(Content) 视图层之视图函数(views) 一个简单的视图1.HttpRequest2.HttpResponse 1.render 函数 2.redirect 函数对比render与redirect&#xff1a; 回到顶部(go to top) 视图层之视图函数(views) 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python …

【Excel】设计简单抽奖小程序

其实我们可以通过excel做一个抽奖的小程序。比如搞活动送奖品&#xff0c;我们就可以通过这个小程序抽中奖名单 中奖名单下面输入“INDIRECT("A"&RANDBETWEEN(4,12))”&#xff0c;然后按F9进行抽奖 其中用到了两个函数INDIRECT(单元格引用&#xff0c;[引用样式…