2018.3.13
1.python的OOP
直接看例子:
class Student(object):
pass
類名一般大寫,括號內部表示繼承.如果沒有合適的繼承類,就直接繼承object類.
這裏OOP最大的不同是一個實例可以綁定各種數據,同一個類的兩個實例的變量名可以有很大區別:
bob = Student()
bob.name = 'bob'
這種爲實例隨意增加變量的屬性是動態語言特有的.
更加規範的,加上方法的類的寫法如下:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.grade > 95:
print('4.3')
elif self.grade >90:
print('4.0')
else:
print('less than 4.0')
def print_score(self):
print("%s : %s" % (self.name,self.grade))
構造函數的寫法就是利用一個特殊的__init__
方法,第一個參數必須是self. 其餘的方法寫法和python寫函數的區別也就在一個self變量.沒什麼太大區別.調用方法的時候self是解釋器自動傳進去的,不用多管:
bob = Student('bob',95)
bob.get_grade()
bob.print_score()
2.私有屬性
python的私有屬性定義的時候以雙下劃線開頭,這樣就讓外部無法直接訪問.設置私有屬性更改值之類的都用方法來實現,這樣可以檢查參數,保證沒有無效值出現.
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))
def set_score(self,score):
self.__score = score
3.多態性質
由於有繼承,那麼子類就可以直接調用父類方法.如果需要覆蓋,直接覆蓋即可很方便
4. type()函數
拿到一個對象,要知道它是什麼類的實例,可以使用type方法,type的返回值就是該對象的類:
>>> type(123)==type(456)
True
>>> type(123)==int
True
>>> type('abc')==type('123')
True
>>> type('abc')==str
True
>>> type('abc')==type(123)
False
5.isinstance()
>>> a = Animal()
>>> d = Dog()
>>> h = Husky()
>>>> isinstance(h, Husky)
True