高淇python讲义百度文库_python 面向对象01
原創是:高淇老師講義
Python 中 一切皆對象
=====================================================================================================================================
class Student:
school = "清華大學" # 類屬性
count = 0 # 類屬性
def __init__(self, name, score):# 構造方法(語言自帶)
self.name = name # 實例屬性
self.score = score
Student.count = Student.count+1
def say_score(self): # 實例方法(自定義)
print("學校是:", Student.school)
print(self.name, '的分數是:', self.score)
s1 = Student('張三', 80) # s1 是實例對象,自動調用__init__()方法
s1.say_score() # 實例對象調用實例方法
Student.say_score(s1)
print('一共創建{0}個 Student 對象'.format(Student.count))
=====================================================================================================================================
類-->類對象
類的實例-->實例對象
定義類
1、類名稱 首字母大寫,包含字母、數字、下劃線,多個單詞:駝峰命名
2、類成員 屬性+方法
2.1、類屬性
2.2、類方法
2.3、實例屬性
2.4、實例方法
2.6、靜態方法
2.7、語法定義的方法
實例對象,自動調用__init__(self[,])方法。
Python 對象包含三個部分:
1、id(identity 識別碼)
2、type(對象類型)
3、value(對象的值)
屬性(attribute)
方法(method)
=====================================================================================================================================
構造方法:
1、__init__(self[,])
2、構造方法作用:用來初始化實例對象的實例屬性
3、構造函數調用 類名(參數)
4、__init__(self[,])方法 自己定義系統就不自動定義了,如果自己不定義,系統將自動定義一個不帶參數的。
__new__()方法: 用于創建對象,無需重定義該方法,系統自動完成。
實例屬性:實例對象的屬性
1、實例屬性一般在__init__()方法中
2、本類中訪問:self.實例屬性名
3、創建實例對象后訪問:實例對象.實例屬性名
4、實例對象可以自行添加實例屬性(事先在類中并未定義改實例屬性)
=====================================================================================================================================
實例方法:
1、def 方法名(self [, 形參列表]):
函數體
2、對象.方法名([實參列表])
3、特別需注意:實例方法第一個不管是否有自定義參數,參數列表第一個參數必須是self。實例對象調用實例方法時忽略self。
函數 vs 實例方法
1、特定功能的代碼塊
2、函數要用直接調用,實例方法則需要通過實例對象才能調用(類外部)
3、self
1、dir(obj)可以獲得對象的所有屬性、方法
2、obj.__dict__ 對象的屬性字典
3、pass 空語句
4、isinstance(對象,類型)判斷"對象"是不是"指定類型"
=====================================================================================================================================
類對象、類屬性、類方法、靜態方法
類屬性:
類屬性屬于類對象,可以被所有實例對象共享。
=====================================================================================================================================
類方法:
類方法"類對象"的方法。
類方法通過裝飾器@classmethod 來定義。
@classmethod
def 類方法名(cls[,形參列表]):
函數體
1、@classmethod 必須位于方法上面一行
2、cls
3、類方法調用:類名.類方法名
4、類方法訪問實例屬性和實例方法會導致錯誤。(原因:實例屬性,實例方法是實例對象調用的,如果在類方法中直接調用,可能根本沒實例對象)
5、...
pass 占位符
class Student:
school = "清華大學" # 類屬性
@classmethod
def printCompany(cls):
print(cls.school)
Student.printCompany()
=====================================================================================================================================
靜態方法:
@staticmethod
def 靜態方法名([形參列表]) :
函數體
1、@staticmethod 必須位于方法上面一行
2、調用靜態方法格式:"類名.靜態方法名(參數列表)"
3、靜態方法中訪問實例屬性和實例方法會導致錯誤
class Student:
@staticmethod
def add(a, b): # 靜態方法
print("{0}+{1}={2}".format(a, b, (a+b)))
return a+b
Student.add(20, 30)
=====================================================================================================================================
__del__方法(析構函數)和垃圾回收機制
對象沒有被引用時(引用計數為 0),由垃圾回收器調用__del__()方法。
系統會自動提供__del__方法,一般不需要自定義析構方法。
class Person:
def __del__(self):
print("銷毀對象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序結束")
=====================================================================================================================================
__call__方法和可調用對象
class SalaryAccount:
def __call__(self, salary):
yearSalary = salary*12
return dict(yearSalary=yearSalary)
s = SalaryAccount()
print(s(150000))
=====================================================================================================================================
Python 中方法沒有重載
方法簽名包含 3個部分:
1、方法名
2、參數數量
3、參數類型
定義多個同名方法,只有最后一個有效。(最后一個覆蓋了前面的)
=====================================================================================================================================
方法的動態性
class Person:
def work(self):
print("努力上班!")
def play_game(self):
print("{0}玩游戲".format(self))
def work2(s):
print("好好工作,努力上班!")
Person.play = play_game
Person.work = work2
p = Person()
p.play()
p.work()
Person.play 這個地方的play 在類中并未定義
Person.work 雖然定義了,還是可以重新賦值
通過右邊的內容,確定左邊的對象。
=====================================================================================================================================
私有屬性和私有方法(實現封裝)
1、兩個下劃線開頭的屬性是私有的。
2、類內部可以訪問私有屬性(方法)
3、類外部不能直接訪問私有屬性(方法)
4、類外部可以通過"_類名__私有屬性(方法)"訪問
class Employee:
__company = "xxx" # 私有類屬性. 通過 dir 可以查到 _Employee__company
def __init__(self, name, age):
self.name = name
self.__age = age # 私有實例屬性
def say_company(self):
print("我的公司是:", Employee.__company) # 類內部可以直接訪問私有屬性
print(self.name, "的年齡是:", self.__age)
self.__work()
def __work(self): # 私有實例方法 通過 dir 可以查到 _Employee__work
print("工作!好好工作,好好賺錢,娶個媳婦!")
p1 = Employee("110", 32)
print(p1.name)
print(dir(p1))
p1.say_company()
print(p1._Employee__age)
# 通過這種方式可以直接訪問到私有屬性。通過 dir 可以查到屬性:_Employee__age
# print(p1.__age) #直接訪問私有屬性,報錯
# p1.__sleep() #直接訪問私有方法,報錯
有屬性"__age"在實際存儲時是按照"_Person__age"這個屬性來存儲的。
=====================================================================================================================================
@property 裝飾器
@property 可以將一個方法的調用方式變成"屬性調用"
class Employee:
def __init__(self, name, salary):
self.name = name
self.__salary = salary
@property # 相當于 salary 屬性的 getter 方法
def salary(self):
print("月薪為{0},年薪為{1}".format(self.__salary, (12*self.__salary)))
return self.__salary
@salary.setter
def salary(self, salary): # 相當于 salary 屬性的 setter 方法
if(0 < salary < 1000000):
self.__salary = salary
else:
print("薪水錄入錯誤!只能在 0-1000000 之間")
emp1 = Employee("高淇", 100)
print(emp1.salary)
emp1.salary = -200
=====================================================================================================================================
屬性和方法命名總結
1、_xxx:保護成員,不能用“from module import * ”導入,只有類對象和子類對象能訪問這些成員。
2、__xxx__:系統定義的特殊成員
3、__xxx: 類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問。(但,在類外部可以通過“對象名. _類名__xxx”這種特殊方式訪問。Python 不存在嚴格意義的私有成員)
注:再次強調,方法和屬性都遵循上面的規則。
總結
以上是生活随笔為你收集整理的高淇python讲义百度文库_python 面向对象01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim编写python_用vim写pyt
- 下一篇: python to sql_python