Python說文解字 雜談04

2022-09-18 10:15:31 字數 3279 閱讀 8244

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 abc

class 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是所有類都繼承的基類。...