Python學習筆記10 類的定製

2021-08-19 02:56:56 字數 3057 閱讀 3436

# 形如__***__的變數或函式在python中是有特殊用途的

# __slots__用於限制類例項的能動態新增的屬性,可以通過__getattr__()方法破解

class student(object):

__slots__ = ('__name', 'name', 'age') # 用tuple定義允許繫結的屬性名稱

def __init__(self, name='lily'):

self.name = name

s = student()

s.name = 's'

s.age = 25

# s.score = 100 # 因在類裡進行了限制,此處繫結會報錯attributeerror

# __len__()方法是為了能讓class使用len()函式,如len('abc')等同於'abc'.__len__()

class lenclass(object): # 在類中寫入__len__()方法後便可用len(obj)

def __len__(self):

return 100

c = lenclass()

len(c)

# __str__()方法用於print(class)時展示類資訊,__repr__()方法用於直接呼叫class時展示類資訊

class strclass(object):

def __init__(self, name):

self.__name = name

def __str__(self):

return '%s class' % self.__name

__repr__ = __str__

print(strclass('strclass')) # 測試__str__()作用

strclass('strclass') # 測試__repr__()作用

# __iter__()方法返回乙個迭代物件,然後python的for迴圈就會不斷呼叫該迭代物件的__next__()方法拿到迴圈的下乙個值,知道stopiteration錯誤時退出迴圈

# 以斐波那契數列(從第三個數開始,後乙個數的值是前兩個數的和)為例

class fib(object):

def __init__(self):

self.a, self.b = 0, 1 # 初始化兩個計數器a,b

def __iter__(self):

return self # 例項本身就是迭代物件,故返回自己

def __next__(self):

self.a, self.b = self.b, self.a + self.b # 計算下乙個值

if self.a > 1000: # 退出迴圈的條件

raise stopiteration()

return self.a # 返回下乙個值

for n in fib():

print(n)

# __getitem__()方法可以使類的例項表現的像list一樣按照下標取出元素,也可實現對其進行切片等操作(需要自己定義)

# 與之對應的是__setitem__()方法,把物件做為list或dict來對集合賦值

# __delitem__()方法用於刪除某個元素

def getitem(self, n):

if isinstance(n, int): # 若n是索引,則返回乙個值

a, b = 1, 1

for x in range(n):

a, b = b, a + b

return a

if isinstance(n, slice): # 若n是切片,則返回乙個list

start = n.start

stop = n.stop

if start is none:

start = 0

a, b = 1, 1

l =

for x in range(stop):

if x >= start:

a, b = b, a + b

return l

fib.__getitem__ = getitem

f = fib()

print(f[0])

print(f[10])

print(f[:10])

# __getattr__(),在沒有找到屬性或方法的情況下會呼叫__getattr__()方法來查詢並呼叫

# 通過此方法可以變相繞開__slots__對屬性的限制

# 呼叫其他未定義的屬性或方法時都會返回none,若要class只響應特定的幾個屬性,那麼在最後要丟擲attributeerror錯誤

def getattr(self, attr):

if attr == 'age': # 返回屬性

return 25

if attr == 'getscore': # 返回函式

return lambda: 100

raise attributeerror('類不含有名稱為 %s 的屬性或方法' % attr)

student.__getattr__ = getattr

s = student()

print(s.age) # 呼叫屬性

print(s.getscore()) # 呼叫函式

# print(s.abc) #呼叫例項中不包含的屬性時輸出定製的錯誤資訊

# 通過這種方法可以把乙個類所有的屬性和方法呼叫全部動態化處理,作用是可以針對完全動態的情況作呼叫如很多**的rest api

# __call__()方法:在乙個類中定義了此方法後就可以直接對類的例項按照方法的方式進行呼叫

def class_call(self):

print('name is %s' % self.name)

student.__call__ = class_call

s = student('scrapy')

s()print(callable(student()))

# 可以通過callable()函式判斷乙個物件是否是「可呼叫」物件

python類定義的講解 python類定義的講解

一 類定義 如下 class 類例項化後,可以使用其屬性,實際上,建立乙個類之後,可以通過類名訪問其屬性。如果直接使用類名修改其屬性,那麼將直接影響到已經例項化的物件 類的私有屬性 private attrs 兩個下劃線開頭,宣告該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 ...

python類定義的講解 python類定義的講解

python類定義的講解 是怎麼定義類的,看了下面的文章大家就會了,不用多說,開始學習。一 類定義 如下 class 類例項化後,可以使用其屬性,實際上,建立乙個類之後,可以通過類名訪問其屬性。如果直接使用類名修改其屬性,那麼將直接影響到已經例項化的物件 類的私有屬性 private attrs 兩...

python 學習筆記(10)

字串方法 find join lower replace split strip translate find 可以在乙個較長的字串中查詢字串,返回值是這個字串所在的位置的最左端索引,找不到返回 1 例 with a moo moo here,and a moo moo there find moo...