Python 面向對象編程
- 關鍵字: 類、實例、繼承、類屬性、實例屬性、私有變量、特殊變量
# 聲明一個類(class)
classAnimal(object):
defeat():
print('Animal can eat~')
聲明一個子類 Dog,繼承自 Animal
classDog(Animal):
# 聲明一個特殊公有變量(類屬性)
__fatherClass__ = 'Animal'
# 聲明一個私有變量(類屬性)
__currentClass = 'Dog'
# 新建實例時的初始化函數
# 私有變量 __name,__age 為實例屬性
def__init__(self,name,age):
self.__name = name
self.__age = age
defwho(self):
print('A dog, named %s' % self.__name)
# 重寫父類的 eat 方法
defeat():
print('Dog can eat~')
聲明一個子類 Cat,繼承自 Animal
classCat(Animal):
# 重寫父類的 eat 方法
defeat():
print('Cat can eat~')
新建一個實例(instance)
dog = Dog('二哈', 3)
dict 存儲實例屬性
dog.dict => {'_Dogname': '二哈', '_Dogage': 3}
</code></pre>
- __name: 定義私有屬性(前面是兩個下劃線)
- __name__: 定義特殊公有屬性
- __dict__: 存儲實例屬性
- dir(obj): 查看當前對象所有的屬性方法
- 注意區分實例屬性和類屬性
- 繼承 最大的好處是子類獲得了父類的全部功能
- 多態 是同一個行為具有多個不同表現形式或形態的能力,比如上面代碼的 eat 行為有多種不同的表現
# 檢測對象是否擁有某個屬性
hasattr(dog, 'name') => False
hasattr(dog, '_Dogname') => True
getattr(dog, '_Dogname') => '二哈'
</code></pre>
高級概念
-
關鍵字:
slots、@property</p> </li>
slots 用來限制實例添加自定義屬性,子類實例允許定義的屬性就是自身的 slots 加上父類的 slots__</p> </li>
</ul>
# 聲明一個類(class)
classAnimal(object):
# 限制實例可綁定的屬性
__slots__ = ()
defeat():
print('Animal can eat~')
聲明一個子類 Dog,繼承自 Animal
classDog(Animal):
# 限制實例可綁定的屬性
__slots__ = ('name','age')
def__init__(self,name):
self.name = name
聲明一個子類 Cat,繼承自 Animal
classCat(Animal):
pass
新建一個實例(instance)
dog = Dog('二哈')
dog.name => '二哈'
dog.age = 3
dog.age => 3
dog.father = '大二哈' => 報錯
</code></pre>
- @property 裝飾器: 把類中的一個方法變成屬性,然后調用
classStudent(object):
def__init__(self, name, idNumber):
self.__name = name
self.__idNumber = idNumber
# 讀取屬性 name
# 因為沒有為 name 屬性設置 setter,所以 name 屬性只讀
@property
defname(self):
return self.__name
# 讀取屬性 idNumber
@property
defidNumber(self):
return self.__idNumber
# 修改屬性 idNumber
@idNumber.setter
defidNumber(self, value):
self.__idNumber = value
s = Student('percy','20141111')
s.name => 'percy'
s.name = 'bob' => 報錯
s.idNumber => '20141111'
s.idNumber = '20143333' => '20143333'
</code></pre>
- 多重繼承: 一個子類繼承多個父類
classFather111(object):
pass
classFather222(object):
pass
classFather333(object):
pass
子類 Son 繼承了 3 個父類
classSon(Father111, Father222, Father333):
pass
</code></pre>
- 定制類: 通過為類定義一些特定的方法從而起到定制類的效果。
classStudent(object):
# __init__ 用于初始化實例,類似其他語言的構造函數
def__init__(self, name):
self.__name = name
# __str__ 在給當前實例應用 str() 方法時調用
def__str__(self):
print('你一定給當前實例調用了 str() 方法~')
return 'some string'
# __len__ 在給當前實例應用 len() 方法時調用
def__len__(self):
print('你一定給當前實例調用了 len() 方法~')
return 111
# __call__ 在把實例對象當成方法使用時調用
def__call__(self):
print('你一定把當前實例當方法調用了~')
p = Student('jack')
自行運行查看效果
str(p)
len(p)
p()
</code></pre>
以上。
來自:http://blog.percymong.com/2017/03/22/python-OOP/