筆記2:python 類
python 類:
一。類就是一組用來描述如何生成一個物件的程式碼段
在 Python 中,可以把類理解成也是一種物件。
python中類的三個特性:
1.身份:每個物件都有一個唯一的身份標識自己,任何物件的身份都可以使用內建函式 id() 來得到,可以簡單的認為這個值是該物件的記憶體地址。
2.型別:物件的型別決定了物件可以儲存什麼型別的值,有哪些屬性和方法,可以進行哪些操作,遵循怎樣的規則。可以使用內建函式 type() 來檢視物件的型別。
3.值:物件所表示的資料
因為只要使用關鍵字 class
,Python 直譯器在執行的時候就會建立一個物件。
class ObjectCreator(object):
pass
mObject = ObjectCreator()
print(mObject)
輸出:
<__main__.ObjectCreator object at 0X000000000023ee048>
如:
class ObjectCreator(object):
pass
當程式執行這段程式碼的時候,就會在記憶體中建立一個物件,名字就是ObjectCreator。這個物件(類)自身擁有建立物件(類例項)的能力,而這就是為什麼它是一個類的原因。但是,它的本質仍然是一個物件,於是我們可以對它做如下的操作:
print(ObjectCreator)
echo(ObjectCreator)
objectCreator = ObjectCreator
print(objectCreator)
返回
二。 使用type()動態建立類
因為類也是物件,所以我們可以在程式執行的時候建立類。
Python 是動態語言。
動態語言和靜態語言最大的不同,就是函式和類的定義,不是編譯時定義的,而是執行時動態建立的。
type()
在
hello.py
模組下
然後在另一個模組中引用 hello 模組,並輸出相應的資訊。
其中 type()
函式的作用是可以檢視一個型別和變數的型別。
Hello
是一個 class
,它的型別就是 type
,而 h
是一個例項,它的型別就是 com.twowater.hello.Hello
。
其實 type()
函式不僅可以返回一個物件的型別,也可以創建出新的型別。
class 的定義是執行時動態建立的,而建立 class 的方法就是使用 type()
函式。
type(即將新建的類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))
def printHello(self,name='py'):
print('hello,', name)
#建立Hello類
Hello =type('Hello',(object,),dict(hello=printHello))
#例項化Hello類
h=Hello()
#呼叫方法
h.hello()
print(type(Hello))
print(type(h))
返回
hello, py
<class 'type'>
<class '__main__.Hello'>
三。元類
元類就是用來建立類的。也可以換個理解方式就是:元類就是類的類。
實際上 type()
*函式是一個元類。type()
就是 Python 在背後用來建立所有類的元類。*
為什麼 type()
函式是 type 而不是 Type呢?
這可能是為了和 str 保持一致性,str 是用來建立字串物件的類,而 int 是用來建立整數物件的類。
type 就是建立類物件的類。
Python 中所有的東西,注意喔,這裡是說所有的東西,他們都是物件。
這包括整數、字串、函式以及類。它們全部都是物件,而且它們都是從一個類建立而來。
<class 'int'> <class 'str'> <class 'function'> <class 'main.eat'>
建立這些類的類是什麼?
四:自定義元類
'__metaclass__'
metaclass:當我們定義了類以後,就可以根據這個類創建出例項,所以:先定義類,然後建立例項。
先定義metaclass,然後建立類,最後搞例項。
class MyObject(object):
__metaclass__ = something…
[…]
如果是這樣寫的話,Python 就會用元類來建立類 MyObject。
當你寫下 class MyObject(object),但是類物件 MyObject 還沒有在記憶體中建立。Python 會在類的定義中尋找 metaclass 屬性,如果找到了,Python 就會用它來建立類 MyObject,如果沒有找到,就會用內建的 type 函式來建立這個類。 元類的主要目的就是為了當建立類時能夠自動地改變類。
# 返回一個類,將屬性都換成大寫形式
def upper_attr(future_class_name, future_class_parents, future_class_attr):
attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
uppercase_attr = dict((name.upper(), value) for name, value in attrs)
return type(future_class_name, future_class_parents, uppercase_attr)
class Foo(object, metaclass=upper_attr):
bar = 'bisheep'
print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR'))
f = Foo()
print(f.BAR)
return
False
True
bisheep