1. 程式人生 > >面向對象-元類

面向對象-元類

exec als local 命名 clas html 圖片 分享 返回值

http://www.cnblogs.com/linhaifeng/articles/8029564.html

類的類就為元類

元類所需知識

#exec()
#參數1:字符串形式的命令
#參數2:全局作用域(字典形式),不指定默認使用全局globals()
#參數3:局部作用域(字典形式),不指定默認使用局部locals()
g={x:1,
   y:2}
l={}
#把exec中代碼當一個函數來看待
exec("""
global x,m
x=10
m=100
z=3""",g,l)
print(g)
print(l)

技術分享圖片技術分享圖片

一切皆對象,對象可以怎麽來用,共性?

  1. 都可以被應用,x=obj
  2. 都可以當函數的參數傳入
  3. 都可以當函數的返回值
  4. 都可以當作容器類型的元素,如都可當列表的元素
#類也是一個對象
class Foo:
    pass
obj=Foo()
print(type(obj))
print(type(Foo))

技術分享圖片

  • 產生類的類稱之為元類,默認所有用class定義的類,他們的元類是type

定義類的方式

#方式一定義類:
class Chinese:
    country=China
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def talks(self):
        
print("%s is talking" % self.name) #方式二定義類: #定義類的三要素 # 類名,類的基類,類的命名空間 class_name=Chinese class_base=(object,) class_body=""" country=‘China‘ def __init__(self,name,age): self.name=name self.age=age def talks(self): print("%s is talking" % self.name) """ class_dic={} exec(class_body,globals(),class_dic) Chinese1
=type(class_name,class_base,class_dic) print(Chinese) print(Chinese1)

技術分享圖片

自定義元類來控制類的創建

面向對象-元類