1. 程式人生 > 其它 >筆記2:python 類

筆記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