1. 類的創建: 特殊方法“__init__”, 類似於java裏面的構造函數 以及特殊參數 self
# cording = 'UTF-8'
class student():
def __init__(self, name, age):
self.name= name
self.age=age
def printself(self):
print ('name:', self.name, ', age: ', self.age)
xiaoming= student('XIAOMING', 19)
student.printself(xiaoming)
2. 如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__,在Python中,實例的變量名如果以__開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問,所以,我們把Student類改一改:
# cording = 'UTF-8'
class student():
def __init__(self, name, age):
self.__name= name
self.__age=age
def printself(self):
print ('name:', self.__name, ', age: ', self.__age)
xiaoming= student('XIAOMING', 19)
student.printself(xiaoming)
#print (xiaoming.__age) error
3. 繼承可以把父類的所有功能都直接拿過來,這樣就不必重零做起,子類只需要新增自己特有的方法,也可以把父類不適合的方法覆蓋重寫;
有了繼承,纔能有多態。在調用類實例方法的時候,儘量把變量視作父類類型,這樣,所有子類類型都可以正常被接收;
4. 靜態語言 vs 動態語言
對於靜態語言(例如Java)來說,如果需要傳入Animal類型,則傳入的對象必須是Animal類型或者它的子類,否則,將無法調用run()方法。
對於Python這樣的動態語言來說,則不一定需要傳入Animal類型。我們只需要保證傳入的對象有一個run()方法就可以了:
5. 獲取對象信息
#cording = 'UTF-8'
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
#get the object infos
print (type(obj))
print (isinstance(obj, MyObject))
#dir()
print (dir(obj))
#hasattr()
print (hasattr(obj, 'x'))
print (hasattr(obj, 'y'))
#setattr()
setattr(obj, 'y', 19)
print (hasattr(obj, 'y'))
#getattr()
print (getattr(obj, 'y'))
#set a defaul value for attribute z while not found
print (getattr(obj, 'z', 404))
6. 實例屬性和類屬性
由於Python是動態語言,根據類創建的實例可以任意綁定屬性。
給實例綁定屬性的方法是通過實例變量,或者通過self變量:
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
但是,如果Student類本身需要綁定一個屬性呢?可以直接在class中定義屬性,這種屬性是類屬性,歸Student類所有:
class Student(object):
name = 'Student'
來測試一下:
>>> class Student(object):
... name = 'Student'
...
>>> s = Student() # 創建實例s
>>> print(s.name) # 打印name屬性,因爲實例並沒有name屬性,所以會繼續查找class的name屬性
Student
>>> print(Student.name) # 打印類的name屬性
Student
>>> s.name = 'Michael' # 給實例綁定name屬性
>>> print(s.name) # 由於實例屬性優先級比類屬性高,因此,它會屏蔽掉類的name屬性
Michael
>>> print(Student.name) # 但是類屬性並未消失,用Student.name仍然可以訪問
Student
>>> del s.name # 如果刪除實例的name屬性
>>> print(s.name) # 再次調用s.name,由於實例的name屬性沒有找到,類的name屬性就顯示出來了
Student