python中的type,元类,类,对象用法
作者:likely001 发布时间:2022-08-24 09:54:55
标签:python,type,元类,对象
type,元类,类,对象
简单描述
1.type是python内建元类,新建的元类需要继承type
2.元类用来创建类,类用来创建对象
类的生成方式
传统定义通过声明关键字class
#1.创建Person类
#2.继承object
#3.拥有属性eat
class Person(object):
def eat(self,food="rice"):
print("eat %s"%food)
p = Person()
p.eat(food="fruits")
通过type生成
注:该方法一般很少用,一般先由type生成元类,再有元类生成类,由类衍生出对象实例
def eat(self,food="rice"):
print("eat %s"%food)
People = type("People",(object,),{"eat":eat})
#People = type("People",(object,),dict(eat=eat))
p = People()
p.eat()
元类
一般来说元类均被命名为以MetaClass为后缀,元类是由type衍生出来,所以需继承type,元类的操作都在new方法中完成,new方法在init方法之前调用
示例一
#方式1,使用lambda匿名函数
class LanguageMetaClass(type):
def __new__(cls, name, bases, attrs):
attrs['speak'] = lambda self:print(self.language)
return type.__new__(cls,name,bases,attrs)
#方式2,使用预定义的函数
def speak(self):
print("speak %s"%self.language)
#创建元类LanguageMetaClass
class LanguageMetaClass(type):
def __new__(cls, name, bases, attrs):
attrs['speak'] = speak
#return type.__new__(cls,name,bases,attrs)
return super(LanguageMetaClass,cls).__new__(cls.name,bases,attrs)
#使用创建好的元类创建类(python2.x与3.x方式不一致)
#python2.x
#默认新式类由type()构造,当在类中定义了__metaclass__则由其构建,__metaclass__查找顺序:
#1.查找自身的__metaclass__属性
#2.如果有父类,查找父类的__metaclass__(通过父类.__class__属性获取)
#3.如果没有父类,查找模块中的__metaclass__
class People(object):
__metaclass__ = LanguageMetaClass
def __init__(self,language="chinese"):
self.language = language
#python3.x
#默认新式类由type()构造,可以通过指定metaclass关键字参数后,则由metaclass构造
class People(object,metaclass=LanguageMetaClass):
def __init__(self,language="chinese"):
self.language = language
p1 = People(language="English")
p1.speak() #speak English
p2 = People()
p2.speak() #speak chinese
示例二
#创建元类AddMetaClass
class AddMetaClass(type):
def __new__(cls,name,bases,attrs):
attrs['add'] = lambda self,value:self.append(value)
return type.__new__(cls,name,bases,attrs)
#python2.x
class MyList(list): #MyLIST在list的基础上多了个add方法
__metaclass__ = AddMetaClass
pass
#python3.x
class MyList(list,metaclass=AddMetaClass): #MyLIST在list的基础上多了个add方法
pass
list1 =MyList()
list1.add(1)
print(list1) #[1]
list1.add(2)
print(list1) #[1,2]
元类type学习总结
type是元类,也就是python中所有的类其实本质上都是type这个类的实例化后的对象。
type的作用是干什么呢?
1、我们直接type()来判断一个对象的类型
type不是一个类吗?为什么可以直接去调用呢?因为type类其实也是一个对象,是自己的类的对象,而type类中实现了__cal__()这个方法,我们知道只要实现了__cal__()这个方法的类,那么该类实例化的对象就可以直接被调用,也就是可调用对象,即callable。
下面给个例子:
print(type(1))
print(type('abc'))
print(type([]))
运行结果:
<class 'int'>
<class 'str'>
<class 'list'>
其实判断一个对象的类型,还可以通过isinstance()来判断。
print(isinstance((),tuple))
print(isinstance('abc',str))
print(isinstance([],list))
运行结果:
True
True
True
2、type的第二个作用就是:创建类
其实这个不常用,一般我们都是使用class去调用,而不是使用type;
比如像下面这种:
type("Foo", (object,), {"a":1})
来源:https://blog.csdn.net/qq_16688265/article/details/80378255
0
投稿
猜你喜欢
- 问题怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素解决方案下面的类利用 heapq 模块
- <script>var d = '2013-07-21';var nd = d.replace(new RegE
- 在python开发的过程中,经常会遇到需要打印各种信息。海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性。这时候,如
- 建立合理的索引提高SQL Server的性能在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准。而采用
- 一、介绍正则表达式各语言都有自己的规范,但是基本都差不多,都是由元字符的组合来进行匹配;由于Nmap内嵌的服务与版本探测是使用的Perl正则
- 【人工智能项目】混合高斯模型运动目标检测本次工作主要对视频中运动中的人或物的边缘背景进行检测。那么走起来瓷!!!原视频高斯算法提取工作imp
- 本文实例讲述了常规方法实现python数组的全排列操作。分享给大家供大家参考。具体分析如下:全排列解释:从n个不同元素中任取m(m≤n)个元
- import os,pandas as pd,re#1.获取文件夹下要合并的文件名dirpath = '文件夹地址'#工作表
- 1.使用str.split()方法可以使用pandas 内置的 str.split() 方法实现分割字符串类型的数据,并将分割结果写入Dat
- 本篇博文主要介绍在Python3中如何构造含参构造函数样例如下:class MyOdlHttp: username = '
- 本文实例讲述了PHP实现逐行删除文件右侧空格的方法。分享给大家供大家参考,具体如下:在编辑整理代码的过程中发现网上的一些代码经常会有不少的右
- 块级元素块级元素生成一个元素框,(默认地)它会填充其父级元素的内容,旁边不能有其他元素。换句话说,他在元素框之前和之后生成了“分隔”符。我们
- 引言https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题
- 上期回顾上一次的图像清晰度评价没有成功,主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解,不同的场景灰度的明暗不同,梯度可能会很大
- 一.gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,gb2312中的汉字数量远少于gbk,而gb2312,gbk等都可
- 1、检测登录状态base.pydef checkLogin(func):""" 查看session
- 之前有写过一篇如何使用Pytorch实现two-head(多输出)模型在那篇文章里,基本把two-head网络以及构建讲清楚了(如果不清楚请
- 有一个群友在群里问个如何快速搭建一个搜索引擎,在搜索之后我看到了这个代码所在Git:https://github.com/asciimoo/
- 前言前几天去我姐家里蹭饭吃,发现我姐家里的小外甥女儿已经上小学了,正在疯狂赶作业,加减乘除还有很多题目都经常出错。我姐说老师每天给他们布置了
- 关于数据可视化的模块,之前已经分享过很多了,小伙伴们可以到历史文章中搜索,不过都是静态的可视化数据展示效果。这几天刚刚发现的这款动态数据可视