物件導向高階 二

2022-04-15 13:11:02 字數 3688 閱讀 8530

一、item系列:getitem、_setitem__和__delitem_

二、類的特殊變數:_slots_

三、迭代器協議:_iter__和__next_

四、_module__和__class_

五、類的描述資訊:_doc_

六、析構方法:_del_

七、_enter__和__exit_

八、call

九、元類

class foo:

def __init__(self, name):

self.name =name

def __getitem__(self, item):

return self.__dict__[item]

def __setitem__(self, key, value):

self.__dict__[key] = value

def __delitem__(self, key):

self.__dict__.pop(key)

f = foo('egon')

print(f['name'])

f['age'] = 18

print(f.__dict__)

del f['age']

print(f.__dict__)

class foo():

__slots__ = ['a','b','c']

f = foo()

f.a = 1

f.b = 2

f.c = 3

print(f.a,f.b,f.c)

print(f.__dict__)

迭代器的定義:

以下定義類時,通過在類中增加__iter__和__next__方法,例項化的物件就是可迭代的:

class foo:

def __init__(self, start):

self.start = start

def __iter__(self):

return self

def __next__(self):

if self.start >10:

raise stopiteration

n = self.start

self.start += 1

return n

f = foo(0)

print(next(f))

print(next(f))

for i in f:

print(i)

舉例:使用__iter__和__next__實現range()方法:
class my_range:

def __init__(self, start, end):

self.start = start

self.end = end

def __iter__(self):

return self

def __next__(self):

if self.start > self.end:

raise stopiteration

n = self.start

self.start += 1

return n

for i in my_range(0,3):

print(i)

module表示當前操作的物件屬於哪個模組

class表示當前操作的物件屬於哪個類doc類的描述資訊,而且無法被繼承舉例:根據之前使用授權方式(自定義資料型別方式之一),自定義的open()方法,可以應用析構方法__del__進行優化,當呼叫的方法結束後自動關閉檔案

class open:

def __init__(self, file_path, mode = 'r', encoding = 'utf8'):

self.f = open(file_path, mode = mode, encoding = encoding)

def write(self, value):

self.f.write(value)

def __del__(self):

self.f.close()

print('---del')

f = open('a.txt','w')

f.write('abgc')

def f #此處不呼叫def f也可以,因為會自動呼叫__del__

舉例:自定義的open()方法,也可以使用__enter__和__exit__方法來實現上下文管理協議,獲取檔案控制代碼通過__enter__,當with**執行完畢後呼叫__exit__關閉檔案
class open:

def __init__(self, file_path, mode = 'r', encoding = 'utf8'):

self.f = open(file_path, mode=mode, encoding=encoding)

def __enter__(self):

return self.f

def __exit__(self, exc_type, exc_val, exc_tb):

self.f.close()

with open('a.txt','r') as a:

for i in a:

print(i)

物件加括號,觸發執行。

class foo:

def __init__(self):

pass

def __call__(self, *args, **kwargs):

print('this is call')

f = foo()

f() #物件加括號執行,結果:this is call

#type稱為元類,是所有類的類,利用type模擬class關鍵字的建立過程

def run(self):

pass

class_name = 'spam'

class_base = (object,)

class_dict =

bar = type(class_name,class_base,class_dict)

print(bar)

print(type(bar))

print(bar.__dict__)

#class封裝了以上類的建立過程

class spam:

pass

print(spam)

print(type(spam))

print(spam.__dict__)

#利用type建立乙個空類cls賦值給物件aaa

aaa = type('cls',(),{})

print(aaa)

print(type(aaa))

print(aaa.__dict__)

舉例:建立元類mymeta,foo繼承mymeta,元類中對繼承mymeta的類是否寫注釋__doc__做了限制:

物件導向高階 二

一.總結回顧 1.類 定義 靜態屬性,類屬性 變數 直接寫在類中,全大寫 動態屬性,方法 函式 self 類方法 classmethod cls 靜態方法 staticmethod 沒有預設引數 2.呼叫 物件名.動態屬性 類名.動態屬性 物件 類名.靜態屬性 物件名.靜態屬性 類名.類方法 物件名...

物件導向 高階

json方式的物件導向 json 把方法包在json裡 json物件導向 有人管他叫 命名空間 在公司裡 把同一類 的方法包在一起 拖拽和繼承 物件導向的拖拽 改寫原有的拖拽 繼承 asdf 拖拽 instanceof 檢視物件是某個類的例項 使用繼承 限制範圍的拖拽類 建構函式的偽裝 屬性的繼承 ...

物件導向高階

public class person public void print public class student extends person 重寫了父類方法 public void print public class demo public class demo 1.不能new這個類,只能靠...