python 7物件導向高階程式設計

2022-02-14 08:56:30 字數 3329 閱讀 6141

1-給類動態增加方法

class

student(object):

pass

defset_score(self, score):

self.score =score

student.set_score = set_score #

動態給類增加方法

s =student()

s.set_score(

'dasheng')

print(s.score) #

dasheng

2-使用 __slots__ 限制例項屬性

class

student(object):

__slots__ = ('

name

', '

age') #

用tuple定義允許繫結的屬性名稱

#使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的:

#除非在子類中也定義__slots__,這樣,子類例項允許定義的屬性就是自身的__slots__加上父類的__slots__。

3- @property使用 (方便使用,屬於裝飾器)

class

student(object):

@property #可讀

defbirth(self):

return

self._birth

@birth.setter #可寫

defbirth(self, value):

self._birth =value

@property

def age(self): #

可讀,由於沒有age.setter方法,表示唯讀

return 2015 -self._birth

s =student()

s.birth = 2011 #

設定值print(s.birth) #

獲取值

4-多重繼承, 由於python允許使用多重繼承,因此,mixin就是一種常見的設計。

class

mytcpserver(tcpserver, forkingmixin):

pass

5-定製類

__str__(self) 或 __repr__() #

讓列印物件更好看

__iter__(self) #

用於for ... in迴圈

def__iter__

(self):

return self #

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

__getitem__

#取下標 fib()[5]

def__getitem__

(self, n):

a, b = 1, 1

for x in

range(n):

a, b = b, a +b

return

a__getattr__() #

當呼叫不存在的屬性時,會試圖呼叫__getattr__(self, 'score')來嘗試獲得屬性

def__getattr__

(self, attr):

if attr=='

age'

:

return

lambda: 25

__call__

#直接對例項進行呼叫

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

介紹的是最常用的幾個定製方法,還有很多可定製的方法,請參考python的官方文件。

6-使用列舉

from enum import

enum

month = enum('

month

', ('

jan', '

feb', '

mar', '

apr', '

may', '

jun', '

jul', '

aug', '

sep', '

oct', '

nov', '

dec'

))for name, member in month.__members__

.items():

print(name, '

=>

', member, '

,', member.value)

6.1使用類建立

from enum import

enum, unique

@unique

class

weekday(enum):

sun=0

mon = 1,

tue = 2day1 =weekday.mon

print(day1 == weekday.tue)#

false

print(day1)#

print(day1)

print(day1.value) #

print(day1)

7 使用元類建立

type()函式既可以返回乙個物件的型別,又可以建立出新的型別

def fn(self, name='

word'):

print('

hello %s

' %name)

hello = type('

hello

', (object,), dict(hello=fn)) #

建立hello class

print(type(hello)) #

h =hello()

print(type(h)) #

metaclass 魔術方法

class

listmetaclass(type):

def__new__

(cls, name, bases, attrs):

attrs[

'add

'] = lambda

return type.__new__

(cls, name, bases, attrs)

class mylist(list, metaclass=listmetaclass):

pass

__new__

()方法接收到的引數依次是:

1.當前準備建立的類的物件;

2.類的名字;

3.類繼承的父類集合;

4.類的方法集合。

python 物件導向高階程式設計

python 裝飾器 property使用 classscreen property defwidth self returnself.width pass width.setter defwidth self,value self.width value property defheight se...

python物件導向高階程式設計

1.繫結方法 給所有例項都繫結方法,可以給class繫結方法 def set score self,score self.score score student.set score set score 給class繫結方法後,所有例項均可呼叫。但是,如果我們想要限制例項的屬性怎麼辦?比如,只允許對s...

物件導向高階程式設計

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