1. 鴨子型別:
當你看到乙隻鳥走來像鴨子,游泳起來像鴨子,叫起來也像鴨子,他麼他就可以叫做鴨子。任何可迭代的物件。一樣的方法,可以用可迭代的話,就可以迭代的組合列印。__getitem__可以塞到任何的類中,跟鴨子型別一樣,指定相同的方法名。魔法函式正是充分運用了鴨子型別,能夠被本身呼叫。
class cat(object): def say(self):
print(
"i am a cat")
class dog(object
): def say(self):
print(
"i am a dog")
def __getitem__(self, item):
return
"bobby
"class duck(object
): def say(self):
print(
"i am a duck")
animal_lst =[cat,dog,duck]
for animal in
animal_lst:
animal().say()
class
company:
def __init__(self,employee_list):
self.employee =employee_list
def __getitem__(self, item):
return
self.employee[item]
a = ["
bobby1
","bobby2"]
b = ["
bobby2
","bobby"]
name_tuple = ("
bobby3
","bobby4")
name_set = set
()name_set.add(
"bobby5")
name_set.add(
"bobby6")
# a.extend(b)
# a.extend(name_tuple)
company = company(["
a",[b],"c"
])a.extend(company)
print(a)
2. 抽象基類(abc模組):
abstract base class
可以當做介面。py的抽象基類也不能例項化的。
變數在py當中就是乙個符號。可以指向任何物件。
py信奉的是鴨子型別。把鴨子型別放在第一位。
# 我們去檢查某個類是否具有某種方法。(應用場景一)class company(object
): def __init__(self,employee_list):
self.employee =employee_list
def __len__(self):
return
len(self.employee)
com = company(['
bobby1
','bobby2'])
print(hasattr(com,
"__len__"))
# 我們在某些情況之下希望判定某個物件的型別
from
collections.abc import sized
isinstance(com,sized)
# 我們需要強制某個子類必須去實現某些方法
# 實現了web框架,繼承cache(redis,cache,memerycache)
# 需要設計乙個抽象基類,執行子類必須實現某些方法
# 如何去模擬乙個抽象基類
import abc
# metaclass=abc.abcmeta
class cachebase(metaclass=abc.abcmeta):
@abc.abstractmethod
def
get(self, key):
pass
@abc.abstractmethod
def
set(self, key, value):
pass
class
redicache(cachebase):
def
set(self, key, value):
pass
def
get(self, key):
pass
redis_cache =redicache()
redis_cache.
set("
key","
value
")
記住:抽象的是基類:必須metaclass = abc.abcmeta
記住:抽象基類後有abc.abstractmethod抽象方法,和,abcabstractpropery抽象屬性。
記住:抽象基類的主要作用是「定義」介面。
記住:用的是import abc這個抽象基類,而不是from collections.abc import abc
記住:使用__subclasshook__後只要具體類定義了與抽象類相同的方法就認為是他的子類
import abcclass a(object
): __metaclass__ =abc.abcmeta
@abc.abstractmethod
def say(self):
return
'say yeah
'@classmethod
def __subclasshook__(cls, c):
if cls is
a:
if any("
say"
in b.__dict__ for b in
c.__mro__):
return
true
return
nottmplementd
class b(object
): def say(self):
return
'hello
'print issubclass(b, a) # true
print isinstance(b(), a) # true
print b.__dict__ #
print a.__subclasshook__(b) # true
__mro__ 表示多繼承的順序。
Python說文解字 雜談08
1.python變數到底是什麼?python和j a中的變數本質不一樣,python的變數實質是乙個指標 int str,便利貼 a 1 1.a貼在1上面 2.它的過程是先生成物件,然後貼便利貼。3.is 是指的標籤貼是否一樣。a 1 b 1 這個是一樣,用的是小整數的內部inter機制的內部優化。...
Python說文解字 雜談07
1.深入dict from a 2.常用方法 a bobby2 clear a.clear copy,返回淺拷貝 new dict a.copy new dict bobby1 company imooc3 深拷貝 import copy new dict copy.deepcopy a new d...
Python說文解字 雜談02
1.py中三個中啊喲的概念type object和class的關係。type生成了int生成了1 type class obj type用來生成類物件的 object是最頂層的基類 type也是乙個類,同時type也是乙個物件 結論 類是由type這個類生成的物件。obejct是所有類都繼承的基類。...