python中的type,元类,类,对象用法
作者:likely001 时间:2022-08-24 09:54:55
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
标签:python,type,元类,对象
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
PYTHON 中使用 GLOBAL引发的一系列问题
2023-07-08 16:24:21
Python Lambda函数使用总结详解
2022-05-07 11:41:31
SQL Server转换为XQuery及反向转换
2009-01-20 13:32:00
Python随机生成彩票号码的方法
2023-10-13 15:25:39
Python机器学习工具scikit-learn的使用笔记
2021-08-30 10:28:50
![](https://img.aspxhome.com/file/2023/4/100914_0s.png)
python实现自动化脚本编写
2023-11-13 14:58:14
PHP引用的调用方法分析
2023-11-06 15:23:23
使用python爬取taptap网站游戏截图的步骤
2021-09-17 07:44:34
![](https://img.aspxhome.com/file/2023/6/68316_0s.png)
SpringBoot调用python接口的实现步骤
2022-01-24 22:41:57
![](https://img.aspxhome.com/file/2023/3/118523_0s.png)
python绘制已知点的坐标的直线实例
2023-03-12 08:36:11
Python中join和split用法实例
2021-09-01 21:18:55
pandas数据处理进阶详解
2023-04-15 03:40:33
javascript设计模式 – 简单工厂模式原理与应用实例分析
2023-08-27 19:53:20
系统默认的MySQL用户名消失的解决方法
2008-12-02 14:26:00
Python二维列表的创建、转换以及访问详解
2022-08-09 16:03:15
python和C语言混合编程实例
2023-10-30 22:30:23
python执行get提交的方法
2022-08-09 01:53:12
python 实现体质指数BMI计算
2023-01-25 12:44:56
![](https://img.aspxhome.com/file/2023/1/110571_0s.png)
利用Python编写简易的录制屏幕小工具
2023-12-17 04:34:57
![](https://img.aspxhome.com/file/2023/0/93690_0s.gif)
Go语言快速入门图文教程
2023-07-23 10:30:16
![](https://img.aspxhome.com/file/2023/7/95367_0s.jpg)