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]

猜你喜欢

转载自blog.csdn.net/qq_16688265/article/details/80378255