python之物件導向二

2021-08-31 01:24:26 字數 3282 閱讀 2013

什麼時候用到多型?

如果我們需要用到父類的方法的時候而且要修改父類方法的時候,或者想呈現出不同的效果是就會用到多型

這裡舉個小例子:

class person(object):

def get_name(self):

print('張三')

class studens(person): #繼承自person類

def get_name(self): #修改person類的方法

print('李四')

def huoqu(n):

n.get_name()

a = person()

b = studens()

huoqu(a) #張三

huoqu(b) #李四

什麼是繼承?

子類可以繼承父類所有的公有屬性和公有方法

舉例說明:

class person(object):

money = 100

def get_name(self):

print('張三')

class studens(person): #繼承自person類

pass

a = person() #建立person類的例項物件

a.get_name() #獲取person類的例項方法

b = studens() #建立studens類的例項物件

print(b.money) #呼叫person類的money 屬性

import inspect      #取類或函式的引數的資訊

class e:

def get_name(self):

print("我是類e的方法get_name")

class d:

def get_name(self):

print("我是類d的方法get_name")

class c(e):

def get_name(self):

print("我是類c的方法get_name")

class b(d):

pass

class a(b, c):

pass

a = a()

a.get_name()

print(inspect.getmro(a)) #檢視呼叫關係

mro 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。

用**來舉例子更容易理解,比如乙個學生成績表定義成這樣:

class student(object):

def get_score(self):

return self._score

def set_score(self, value):

if not isinstance(value, int):

raise valueerror('score must be an integer!')

if value < 0 or value > 100:

raise valueerror('score must between 0 ~ 100!')

self._score = value

我們呼叫的時候需要這麼呼叫:

ret = student()

ret.set_score(99)

print(ret.get_score())

ret.set_score(10141)

print(ret.get_score())

但是為了方便,節省時間,我們不想寫s.set_score(9999)啊,

直接寫s.score = 9999不是更快麼,加了方法做限制

不能讓呼叫的時候變麻煩啊

class student(object):

@property

def score(self):

return self._score

@score.setter

def score(self,value):

if not isinstance(value, int):

raise valueerror('分數必須是整數才行吶')

if value < 0 or value > 100:

raise valueerror('分數必須0-100之間')

self._score = value

看上面**可知,把get方法變為屬性只需要加上@property裝飾器即可,

此時@property本身又會建立另外乙個裝飾器@score.setter,

負責把set方法變成給屬性賦值,這麼做完後,我們呼叫起來既可控又方便

呼叫方式:

ret = student()

ret.set_score=99

print(ret.set_score)

解釋:super() 函式是用於呼叫父類(超類)的乙個方法

class a():

def __init__(self,name):

self.name = name

print(name)

class b(a):

def __init__(self,name, age):

super(__class__,self).__init__(name)

self.age =age

b = b('e',19) #e

當我們定義乙個類的時候可以給類動態新增屬性,如下:

class c(object):

pass

r = c()

r.name = '張三'

r.age = 21

r.*** = '男'

那我們不想新增那麼多,或者我只想新增某個屬性怎麼辦,這個時候就用到了__slots__方法,如下:

class students(object):

__slots__ = ('name','age','get_name')

# def __init__(self, score=3):

# # 不在__slots__中則不可設定。

# self.score = score

class pythonstudent(students):

pass

a = students()

a.age = 300

a.name = 'eric'

a.*** = '男'

python之物件導向(二)

針對類物件定義的屬性 使用賦值語句在class關鍵字下可以定義類屬性 當我們定義了乙個類屬性後,這個屬性雖然歸類所有,但類的所有例項都可以訪問到,當例項並沒有該屬性,所以會繼續查詢class的該屬性 class fairy name jing 定義類屬性 print fairy.name xiann...

python基礎之物件導向(二)

class myclass name 名字 def init self print 沒有找到屬性 def get name self name self.name print name p1 myclass 當p1沒有屬性時 init 方法會自動呼叫 p1.get name 封裝是物件導向的三大特性...

Python合集之物件導向 二

在python中,類表示具有相同屬性和方法的物件集合,在使用類時,需要先定義類,然後再建立類的例項,通過類的例項就可以訪問類中的屬性和方法了。在python中,類的定義使用class關鍵字來實現,語法格式如下 class classname 類的幫助資訊 statement 引數說明 classna...