物件導向的高階程式設計

2021-08-29 18:52:43 字數 4291 閱讀 6590

在定義class的時候,定義乙個特殊的__solts__變數,來限制class例項能新增的屬性

class student(object):

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

>>> s = student() # 建立新的例項

>>> s.name = 'michael' # 繫結屬性'name'

>>> s.age = 25 # 繫結屬性'age'

>>> s.score = 99 # 繫結屬性'score'

traceback (most recent call last):

file "", line 1, in attributeerror: 'student' object has no attribute 'score'

__solts__只對當前的類例項起作用,對繼承的子類不起作用

@property裝飾器負責吧乙個方法變成屬性呼叫,相當於getter方法

@property有創造了另外乙個裝飾器@***.setter,負責吧乙個setter方法變成屬性賦值

class student(object):

@property

#相當於getter方法

def mm(self):

return self.__mm

@mm.setter

#相當於setter方法

def mm(self,value):

if not isintance(value,int):

raise valueerror('wrong')

if value<0 or value>100:

raise valueerrror('budui')

self.__mm=value

多重繼承

閱讀: 143524

繼承是物件導向程式設計的乙個重要的方式,因為通過繼承,子類就可以擴充套件父類的功能。

class animal(object):

pass

# 大類:

class mammal(animal):

pass

class bird(animal):

pass

# 各種動物:

class dog(mammal):

pass

class bat(mammal):

pass

class parrot(bird):

pass

class ostrich(bird):

pass

class bat(mammal, flyable): #多繼承乙個

pass

mixin的目的就是給乙個類增加多個功能,這樣,在設計類的時候,我們優先考慮通過多重繼承來組合多個mixin的功能,而不是設計多層次的複雜的繼承關係

class dog(mammal, runnablemixin, carnivorousmixin):

pass

多重繼承的拓撲排序

__str__方法

class student(object):

def __init__(self, name):

self.name = name

def __str__(self):

return 'student object (name=%s)' % self.name

__repr__ = __str__

2.iter__方法 (#這個地方有bug?)

如果乙個類想被用於for … in迴圈,類似list或tuple那樣,就必須實現乙個__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 > 100000: # 退出迴圈的條件

raise stopiteration()

return self.a # 返回下乙個值

for n in fib(): #把類用在迴圈中

print(n)

像list那樣按照下標取出元素,需要實現__getitem__()方法

class fib(object):

def __getitem__(self,n):

a,b=1,1

for x in range(n):

a,b=b,a+b

return a

f=fib()

f[0]

如果想用切片,需要對傳入的引數進行判斷是int,還是slice

class fib(object):

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是切片

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

當呼叫不存在的屬性時,比如score,python直譯器會試圖呼叫__getattr__(self, 『score』)來嘗試獲得屬性,這樣,我們就有機會返回score的值:還可以返回函式。其他呼叫返回none。

class student(object):

def __getattr__(self, attr):

if attr=='age':

return lambda: 25

raise attributeerror('\'student\' object has no attribute \'%s\'' % attr) #按規定丟擲attributeerror

任何類,只需要定義乙個__call__()方法,就可以直接對例項進行呼叫

class student(object):

def __init__(self, name):

self.name = name

def __call__(self):

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

>>> s = student('michael')

>>> s() # self引數不要傳入

my name is michael.

定義常量時,使用列舉類,定義乙個class型別,每個常量都是class的乙個唯一的例項。

enum類

from enum import enum

month = enum('month', ('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'))

type()

要建立乙個class物件,type()函式依次傳入3個引數:

1.class的名稱;

2.繼承的父類集合,注意python支援多重繼承,如果只有乙個父類,別忘了tuple的單元素寫法;

3.class的方法名稱與函式繫結,這裡我們把函式fn繫結到方法名hello上。

hello = type('hello', (object,), dict(hello=fn)) # 建立hello class
學習:深刻理解python中的元類)

Python物件導向程式設計高階

在前面的章節我們已經了解了物件導向的入門知識,知道了如何定義類,如何建立物件以及如何給物件發訊息。為了能夠更好的使用物件導向程式設計思想進行程式開發,我們還需要對python中的物件導向程式設計進行更為深入的了解。property裝飾器 之前我們討論過python中屬性和方法訪問許可權的問題,雖然我...

物件導向高階程式設計

相同class的各物件互為友元 class complex int func const complex param private double re,im string inline string string const char cstr 0 else inline string strin...

物件導向程式設計 高階特性

1 什麼是面向過程?概述 自頂而下的程式設計模式.把問題分解成乙個乙個步驟,每個步驟用函式實現,依次呼叫即可。就是說,在進行面向過程程式設計的時候,不需要考慮那麼多,上來先定義乙個函式,然後使用各種諸如if else for each等方式進行 執行。最典型的用法就是實現乙個簡單的演算法,比如實現氣...