1. 程式人生 > >面向物件-元類介紹

面向物件-元類介紹

儲備知識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)