Python學習-面向對象編程

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章