在定義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等方式進行 執行。最典型的用法就是實現乙個簡單的演算法,比如實現氣...