from abc import abcmeta, abstractmethod
class
student
(object):
job = 'study'
# 靜態字段
# 形如__***__的都可以用來定製類
# __slots__限制類的屬性
# __len__()讓類作用於len函式
# __str__返回使用者看到的字串
# __repr__返回開發者看到的字串
# __iter__() 如果乙個類想for ... in 迴圈, 則必須實現乙個__iter__方法,該方法返回乙個迭代物件
# __getitem__() 新增索引功能
# __call__()把物件當函式使喚
# __getattr__(),動態返回乙個屬性
# __getitem__(), 如果把物件看成dict,__getitem__()的引數也可能是乙個可以作key的object
# 與之對應的是__setitem__()方法,把物件視作list或dict來對集合賦值
# __delitem__()方法,用於刪除某個元素。
# 這裡的私有變數__idcard在這裡需要寫成_student__idcard的格式
__slots__ = ('name', 'age', '***', 'grade', '_student__idcard', 'id') # 該類的屬性只能是這裡面的
def__call__
(self):
# 把物件當函式使喚, 如student1()
print(self.name)
print(self.***)
print(self.grade)
@staticmethod
defsleep
():# 靜態方法(沒有self, 頂上有@staticmethod)
print("i am sleeping.")
def__init__
(self, name, id, ***, grade):
self.name = name # 類的屬性
self.id = id
self.*** = ***
self.grade = grade
self.__idcard = '3623278424230423794097'
# 類的私有屬性, 只有內部可以訪問
defstudy
(self):
# 類的方法
print("i am studying.")
def__love
(self):
# 類的私有方法, 只有內部可以訪問到該方法, 外部無法訪問
print("i am falling love with you.")
@property
defteacher
(self):
# 把方法當做屬性來用(在函式頂上@property), 如 student1.teacher
return
"王老師"
defgetidcard
(self):
# 內部方法訪問私有變數
print(self.__idcard)
@property
defidcard
(self):
# 內部方法訪問私有變數, 並把方法當屬性來用, 就可以通過student.idcard來訪問__idcard
return self.__idcard
@idcard.setter # 這個idcard.setter的idcard是上乙個idcard
defsetidcard
(self, newidcard):
self.__idcard = newidcard
deflove
(self):
# 內部方法訪問私有方法
self.__love()
def__del__
(self):
print("已銷毀")
class
xueba
(student):
# 學霸類繼承學生類
__slots__ = ('habit', 'school') # 子類的slots為自己的加上父類的
def__init__
(self, name, id, ***, grade):
# student.__init__(self, name, id, ***, grade) # 顯示繼承父類的init方法, 效果等同於下一行
super(xueba, self).__init__(name, id, ***, grade) # 顯示繼承父類的init方法, 效果等同於上一行
defstudy
(self):
# 重寫study方法
student.study(self) # 先呼叫父類的study, 然後再次基礎上加工
print("i never stop studying!")
class
superxueba
(xueba):
# 超級學霸類繼承學霸類
pass
class
girlxueba
(xueba):
# 女學霸類繼承學霸類
pass
class
supergirlxueba
(superxueba, girlxueba):
# 超級女學霸類繼承超級學霸類和女學霸類, 多重繼承
pass
defmain
(): s = student(1, 2, 3, 4)
print(s.idcard)
s.getidcard()
s.setidcard = 123
print(s.idcard)
s()x = xueba(1, 2, 3, 4)
print(x.grade)
x.study()
# 使用元類建立類(type()函式)
# type(classname, (father1, father2, ...), dict(function1=f1, function2=f2, ...))
# class的方法名稱與函式繫結,這裡我們把函式fn繫結到方法名hello上
deff1
(self, name='world'):
print('hello %s' % name)
hello = type('hello', (object,), dict(f=f1))
a = hello()
a.f('what')
class
abstractclass
(object):
# 如何寫乙個介面(抽象類+抽象方法 = 介面)
__metaclass__ = abcmeta
@abstractmethod
defsend
(self):
pass
class
b(abstractclass):
# abstractclass是乙個抽象類, send是乙個抽象方法, 所以繼承這個類的話必須定義抽象方法send, 不然會報錯
defsend
(self):
print('send')
if __name__ == '__main__':
main()
python 物件導向程式設計
新式類 class mynewobjecttype bases define mynewobjecttype class class suite經典類 沒有指定乙個父類,或者子類化的基本類沒有父類,就建立了乙個經典類 class mynewobjecttype define mynewobjectt...
Python物件導向程式設計
class mynewobjecttype bases define mynewobjecttype class class suite例項化 myfirstobject mynewobjecttype class mydatawithmethod object defprintfoo self p...
python物件導向程式設計
程式設計正規化 程式設計時程式設計師用特定的語法 資料結構 演算法組成的 在計算機上執行任務的過程。實現乙個任務有不同的方式,對這些不同的程式設計方式的特點進行歸納總結得出的程式設計方式類別,即為程式設計正規化。不同的程式設計正規化本質上代表對各種型別的任務採取的不同的解決問題的思路,兩種最重要的程...