面向對象技術簡介
類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
實例變量:定義在方法中的變量,只作用於當前實例的類。
繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
實例化:創建一個類的實例,類的具體對象。
方法:類中定義的函數。
對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
1.類和實例
類的創建
class後面緊接着是類名,即Student,類名通常是大寫開頭的單詞,緊接着是(object),
表示該類是從哪個類繼承下來的,繼承的概念我們後面再講,通常,
如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類
class Student(object):
pass
定義好了Student類,就可以根據Student類創建出Student的實例,創建實例是通過類名+()實現
bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student
<class '__main__.Student'>
由於類可以起到模板的作用,因此,可以在創建實例的時候,把一些我們認爲必須綁定的屬性強制填寫進去。
通過定義一個特殊的__init__方法,在創建實例的時候,就把name,score等屬性綁上去
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
訪問限制
如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__,在Python中,
實例的變量名如果以__開頭,就變成了一個私有變量(private),
只有內部可以訪問,外部不能訪問
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))
好處:這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯
但是如果外部代碼要獲取name和score怎麼辦?可以給Student類增加get_name和get_score這樣的方法
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
如果又要允許外部代碼修改score怎麼辦?可以再給Student類增加set_score方法
class Student(object):
...
def set_score(self, score):
self.__score = score
__slots__函數
dict字典是可以隨意操作數據,在實例的dict只保持實例的變量,
對於類的屬性是不能保存的,類的屬性包括變量和函數。
__slots__是一個元組,包括了當前能訪問到的屬性。
當定義了slots後,slots中定義的變量變成了類的描述符,相當於java,c++中的成員變量聲明,
類的實例只能擁有slots中定義的變量,不能再增加新的變量。注意:定義了slots後,就不再有dict
class Student(object):
__slots__ = ('x')
x = 9
def __init__(self):
pass
b = Student()
b.x = 1
print b.x
報錯:
Traceback (most recent call last):
File "F:/python/python_Test.py", line 15, in <module>
b.x = 1
AttributeError: 'Student' object attribute 'x' is read-only