已解決:如何給已定義過的類直接添加新方法而不重新定義類?
加入新屬性/方法:
可以用setattr()但是不可以直接類名.新方法(需要在前面先定義) = ..
而給實(shí)例加則都可以
或者 from types import MethodType
s.methodname = MethodType(前面定義過的方法名, s)
輸入 s.methodname
這里的s可以是實(shí)例或者類
調(diào)用 s.方法內(nèi)部的內(nèi)容
或者類名.新方法=前面定義過的方法
定義類:class 類名(父類名(不知道就用object))
導(dǎo)入?yún)?shù):def __init__(self,…)
__init__(self,...)這個構(gòu)造函數(shù)的左右下劃線都是兩個,只用了一個會導(dǎo)致錯誤:
TypeError: object() takes no parameters類沒有參數(shù)
因?yàn)槭怯?code>__init__來導(dǎo)入?yún)?shù),所以少了下劃線就會沒有參數(shù)
如果__init__里沒有self,會把第一個參數(shù)認(rèn)為是self,也不要輸入。其他參數(shù)引用也需要用第一個參數(shù)來引用。
定義方法method:def a(self,i,…)
self必須要,self即為實(shí)例本身,如果不定義self,會自動把第一個變量作為self(否則類沒有意義)
class student(object):
def __init__(self,name,score):
self.name = name
self.score = score
def print_score1(i): #i實(shí)際上就是self
print(i.name)
bart = student('Bart Simpson',59)
bart.print_score1()
Bart Simpson```
**調(diào)用參數(shù)**:`實(shí)例名.參數(shù)`
**調(diào)用類方法**:`實(shí)例名.方法名()` 方法實(shí)際上是一個內(nèi)部的函數(shù) (閉包)
使用方法的時候self不需要輸入且不可以輸入,就算輸入的是實(shí)例名字,也會提示錯誤:
TypeError: print_score() takes 1 positional argument but 2 were given
bart.print_score(bart)
Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: print_score() takes 1 positional argument but 2 were given
其他變量必須要輸入,否則提示錯誤:
`TypeError:a missing 1 required positional argument: 'i'`
class student(object):
... def init(self,name,score):
... self.name = name
... self.score = score
... def print_score1(self,i):
... print(self.name+str(i))
...
bart = student('Bart Simpson',59)
bart.print_score1('2')
Bart Simpson2
bart.print_score1(1)
Bart Simpson1
bart.print_score1(333)
Bart Simpson333
bart.print_score1()
Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: print_score1() missing 1 required positional argument: 'i'
Python允許對實(shí)例變量綁定任何數(shù)據(jù),也就是說,對于兩個實(shí)例變量,雖然它們都是同一個類的不同實(shí)例,但擁有的變量名稱都可能不同:
class student(object):
def init(self,name,score):
self.name = name
self.score = score
def print_score(self):
print('%s:%s'%(self.name,self.score))
bart.age = 8 # bart就多了一個屬性age
最后:定義一個類以后,如果重新class,只會有后面的class的內(nèi)容,第一次的定義都作廢。
----------
**面向?qū)ο缶幊毯兔嫦蜻^程(數(shù)據(jù)流)編程的區(qū)別**
面向?qū)ο螅核伎加心男ο?gt;找到對象的共性定義一個類>調(diào)用的都是對象的方法(method)
對象:數(shù)據(jù)和操作的封裝體。
面向過程:思考有哪些結(jié)果>定義輸出相應(yīng)結(jié)果的函數(shù)>調(diào)用的都是函數(shù)(function)
面向?qū)ο缶幊痰男再|(zhì)1.模塊封裝性 2.多態(tài)性 3.繼承(子類獲得父類的全部功能,并且可以重新定義更改)
python的內(nèi)置方法理解:賦值給變量即為定義了變量,使得變量屬于其變量類型的類,可以調(diào)用類的內(nèi)置方法。
**繼承**
python的根類:object
實(shí)際上類也可以作為一個數(shù)據(jù)類型使用,可以用a()定義以及instance檢驗(yàn)
并且子類是父類的一種,如果一個實(shí)例的數(shù)據(jù)類型是某個子類,那它的數(shù)據(jù)類型也可以被看做是父類
函數(shù)中接受父類后,子類都可以被接收
調(diào)用方只管調(diào)用,不管細(xì)節(jié)。
對擴(kuò)展開放:允許新增子類;對修改封閉:不需要修改依賴父類
的函數(shù)。
python是一種鴨子類型語言:http://www.itdecent.cn/p/4379b3c52fc6
因此繼承顯得不是十分的必要。