码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象-元类介绍

时间:2018-12-31 11:20:46      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:title   函数   foo   知识   nbsp   obj   返回   object   如何   

储备知识exec
参数1:字符串形式的命令
参数2:全局作用域(字典形式),如果不指定默认就使用globals()
参数3:局部作用域(字典形式)如果不指定默认就使用locals()

g={
    x:1,
    y:2
}
l={}

exec("""
global x,m
x=10
m=100

z=3
""",g,l)
print(g)
print(l)
print(g)

 

一切皆对象,对象可以怎么用?
1、被引用,x=obj
2、都可以当做函数的参数传入
3、都可以当做函数的返回值
4、都可以当做容器类的元素,l=[func,time,obj,1]

类也是对象,查看类型,type
class Foo:
    pass

obj=Foo()
print(type(obj))
print(type(Foo))

class Bar:
    pass

print(type(Bar))
产生类的类称之为元类,默认所有用class定义的类,他们的元类都是type
方式一:class
class Chinese:
    country=China

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def talk(self):
        print(%s is talking%self.name)
# print(Chinese)
obj=Chinese(egon,18)
print(obj,obj.name,obj.age)
方式二:type
定义类的三要素:类名,类的基类,类的名称空间
class_name=Chinese
class_bases=(object,)

class_body="""
country=‘China‘

def __init__(self,name,age):
    self.name=name
    self.age=age
    
def talk(self):
    print(‘%s is talking‘%self.name)
"""

class_dic={}
exec(class_body,globals(),class_dic)
print(class_dic)

Chinese1=type(class_name,class_bases,class_dic)
# print(Chinese1)
obj1=Chinese1(egon,18)
print(obj1,obj1.name,obj1.age)
如何定制元类 来控制类的行为
class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        print(class_name)
        print(class_bases)
        print(class_dic)
        if not class_name.istitle():
            raise TypeError(类名的首字母必须大写)

        if __doc__ not in class_dic or not class_dic[__doc__].strip():
            raise TypeError(必须有注释,且注释不能为空)

        super(Mymeta,self).__init__(class_name,class_bases,class_dic)

class Chinese(object,metaclass=Mymeta):
    """
    注释
    """
    country=China

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def talk(self):
        print(%s is talking%self.name)

# Chinese=type(class_name,class_bases,class_dic)

 

 


面向对象-元类介绍

标签:title   函数   foo   知识   nbsp   obj   返回   object   如何   

原文地址:https://www.cnblogs.com/hexiaorui123/p/10201544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!