已解決:如何給已定義過的類直接添加新方法而不重新定義類?
加入新屬性/方法:
可以用setattr()
但是不可以直接類名.新方法(需要在前面先定義) = ..
而給實例加則都可以
或者 from types import MethodType
s.methodname = MethodType(前面定義過的方法名, s)
輸入 s.methodname
這里的s可以是實例或者類
調(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ù)
因為是用__init__
來導(dǎo)入?yún)?shù)侧纯,所以少了下劃線就會沒有參數(shù)
如果__init__
里沒有self翎冲,會把第一個參數(shù)認為是self簸州,也不要輸入缠借。其他參數(shù)引用也需要用第一個參數(shù)來引用拆火。
定義方法method:def a(self,i,…)
self必須要泳梆,self即為實例本身,如果不定義self榜掌,會自動把第一個變量作為self(否則類沒有意義)
class student(object):
def __init__(self,name,score):
self.name = name
self.score = score
def print_score1(i): #i實際上就是self
print(i.name)
bart = student('Bart Simpson',59)
bart.print_score1()
Bart Simpson```
**調(diào)用參數(shù)**:`實例名.參數(shù)`
**調(diào)用類方法**:`實例名.方法名()` 方法實際上是一個內(nèi)部的函數(shù) (閉包)
使用方法的時候self不需要輸入且不可以輸入,就算輸入的是實例名字乘综,也會提示錯誤:
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ù)據(jù),也就是說卡辰,對于兩個實例變量胞皱,雖然它們都是同一個類的不同實例邪意,但擁有的變量名稱都可能不同:
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ù)據(jù)類型使用,可以用a()定義以及instance檢驗
并且子類是父類的一種锭吨,如果一個實例的數(shù)據(jù)類型是某個子類蠢莺,那它的數(shù)據(jù)類型也可以被看做是父類
函數(shù)中接受父類后,子類都可以被接收
調(diào)用方只管調(diào)用零如,不管細節(jié)躏将。
對擴展開放:允許新增子類;對修改封閉:不需要修改依賴父類
的函數(shù)考蕾。
python是一種鴨子類型語言:http://www.reibang.com/p/4379b3c52fc6
因此繼承顯得不是十分的必要祸憋。