類與對象的定義和使用(包含init講解)
阿新 • • 發佈:2019-05-09
() sleep weak 學生 詳細介紹 之前 st2 使用 查看 1.類與對象的概念
對象:特征與技能的集合體
類:一系列對象相似的特征與技能的集合體
即動物類:
特征:鼻子,眼睛,耳朵,嘴巴
技能:吃,跑
在現實世界中,肯定是現有對象,然後人類根據對象的一些共有特征,對其進行分類。
在編程中,需要先定義類,然後實例化產生對象
2.定義類
"現實世界中,先有對象,後產生類" 對象1:張三 特征: 學校=‘my_school‘ 姓名=張三 性別=男 年齡=18 技能: 學習 吃飯 睡覺 對象2:李四 特征: 學校=‘my_school‘ 姓名=李四 性別=女 年齡=38 技能: 學習 吃飯 睡覺 現實中的學生類 相似的特征: 學校=‘my_school‘ 相似的技能: 學習 吃飯 睡覺
"程序中,先有類,後使用類產生對象" #在Python中程序中的類用class關鍵字定義,而在程序中特征用變量標識,技能用函數標識,因而類中最常見的無非是:變量和函數的定義 #定義類 class Student: school=‘my_school‘ def learn(self): print(‘is learning‘) def eat(self): print(‘is eating‘) def sleep(self): print(‘is sleeping‘) #後產生對象 s1 = Student() s2 = Student() print(s1) print(s2) E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test2/ww/ee.py <__main__.Student object at 0x000001AF8F10EBA8> <__main__.Student object at 0x000001AF8F10EB70> Process finished with exit code 0
" 註意: 1.類中可以有任意python代碼,這些代碼是在類定義階段就會執行,因而會產生新的名稱空間,用來存放類的變量名與函數名,可以通過Student.__dict__查看 2.類中定義的名字,都是類的屬性,可以通過Student.來訪問屬性 3.對於經典類,我們可通過__dict__產生的字典操作類名稱空間的名字,但新式類有限 " #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: vita class Student: school = ‘my_school‘ print(school) # 驗證類中的代碼,在定義階段就會執行,因而會產生新的名稱空間 def learn(self): print(‘is learning‘) def eat(self): print(‘is eating‘) def sleep(self): print(‘is sleeping‘) print("Student.__dict__:",Student.__dict__) # 驗證可通過Student.__dict__查看類名稱空間中的變量與函數名 print("Student.school:",Student.school) #驗證可通過.訪問類中的屬性 print("Student.__dict__[‘school‘]",Student.__dict__["school"])# 驗證可通過訪問字典方式訪問類中屬性 E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py my_school Student.__dict__: {‘__module__‘: ‘__main__‘, ‘school‘: ‘my_school‘, ‘learn‘: <function Student.learn at 0x000001F9B0CD1C80>, ‘eat‘: <function Student.eat at 0x000001F9B0CD1D90>, ‘sleep‘: <function Student.sleep at 0x000001F9B0CD1D08>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None} Student.school: my_school Student.__dict__[‘school‘] my_school Process finished with exit code 0
3.類的使用
3.1類屬性的增刪改查
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Student:
school = ‘my_school‘ #數據屬性
def learn(self): #函數屬性
print(‘is learning‘)
def eat(self): #函數屬性
print(‘is eating‘)
def sleep(self):
print(‘is sleeping‘)
#查看類的名稱空間
print("查看類的名稱空間Student.__dict__:",Student.__dict__)
print("查看類的名稱空間Student.__dict__[‘school‘]:",Student.__dict__["school"])
#查詢屬性
print("查詢Student.school",Student.school)
print("查詢Student.__dict__[‘school‘]:",Student.__dict__["school"])
#增加屬性
Student.country=‘China‘
print("增加後的Student.__dict__[‘country‘]:",Student.__dict__["country"])
#刪除屬性
del Student.country
print("刪除後的Student.__dict__:",Student.__dict__)
#修改屬性
Student.school="new_shcool"
print("修改後的Student.__dict__[‘school‘]:",Student.__dict__["school"])
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
查看類的名稱空間Student.__dict__: {‘__module__‘: ‘__main__‘, ‘school‘: ‘my_school‘, ‘learn‘: <function Student.learn at 0x0000021E0D601D90>, ‘eat‘: <function Student.eat at 0x0000021E0D601D08>, ‘sleep‘: <function Student.sleep at 0x0000021E0D60B158>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None}
查看類的名稱空間Student.__dict__[‘school‘]: my_school
查詢Student.school my_school
查詢Student.__dict__[‘school‘]: my_school
增加後的Student.__dict__[‘country‘]: China
刪除後的Student.__dict__: {‘__module__‘: ‘__main__‘, ‘school‘: ‘my_school‘, ‘learn‘: <function Student.learn at 0x0000021E0D601D90>, ‘eat‘: <function Student.eat at 0x0000021E0D601D08>, ‘sleep‘: <function Student.sleep at 0x0000021E0D60B158>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None}
修改後的Student.__dict__[‘school‘]: new_shcool
Process finished with exit code 0
3.2類的實例化
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Student:
school = ‘my_school‘ #數據屬性,屬於類的s1.school會先到s1.__dict__中找,找不到,去Student類中找
def learn(self): #函數屬性
print(‘is learning‘)
def eat(self): #函數屬性
print(‘is eating‘)
def sleep(self):
print(‘is sleeping‘)
s1 = Student()
s2= Student()
# 對象的屬性是專屬於特定對象的屬性,不同對象之間互不影響
#查看對象的名稱空間
#註意:這裏為空,因為school變量是綁定給Student類的,給所有對象使用,不是單獨給某一個對象使用。函數也是綁定給某個對象的,後面會詳細介紹
print("查看類的名稱空間s1.__dict__:",s1.__dict__)
print("查看類的名稱空間s2.__dict__:",s2.__dict__)
#查詢屬性
print("查詢s1.school",s1.school)
print("查詢s2.school",s2.school)
#增加屬性
#增加了屬於該對象的屬性
s1.country=‘China‘
s2.country=‘America‘
print("增加後的s1.__dict__[‘country‘]:",s1.__dict__["country"])
print("增加後的s1.country:",s1.country)
print("增加後的s2.country:",s2.country)
#刪除屬性
del s1.country
print("刪除後的s1.__dict__:",s1.__dict__)
print("刪除後的s2.__dict__:",s2.__dict__)
#修改屬性
#註意:這裏並沒有真正修改類中的scholl變量,而是為s1對象增加了一個school變量
s1.school="new_shcool"
print("修改後的s1.school",s1.school)
print("修改後的s2.school",s2.school)
print("修改後的s1.__dict__:",s1.__dict__)
print("修改後的s2.__dict__:",s2.__dict__)
# 要想真正修改類中的school變量,需要使用Student.school="new_school",並且修改了,對所有對象起作用
Student.school="new_school_class"
del s1.school #因為之前為s1對象增加了school變量,所以需要刪除掉,否則s1.school會先找s1.__dict__中的變量,找不到再去類中找
print("修改Student.school後的s1.school",s1.school)
print("修改Student.school後的s2.school",s2.school)
print("修改Student.school後的s1.__dict__:",s1.__dict__)
print("修改Student.school後的s2.__dict__:",s2.__dict__)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
查看類的名稱空間s1.__dict__: {}
查看類的名稱空間s2.__dict__: {}
查詢s1.school my_school
查詢s2.school my_school
增加後的s1.__dict__[‘country‘]: China
增加後的s1.country: China
增加後的s2.country: America
刪除後的s1.__dict__: {}
刪除後的s2.__dict__: {‘country‘: ‘America‘}
修改後的s1.school new_shcool
修改後的s2.school my_school
修改後的s1.__dict__: {‘school‘: ‘new_shcool‘}
修改後的s2.__dict__: {‘country‘: ‘America‘}
修改Student.school後的s1.school new_school_class
修改Student.school後的s2.school new_school_class
修改Student.school後的s1.__dict__: {}
修改Student.school後的s2.__dict__: {‘country‘: ‘America‘}
Process finished with exit code 0
3.3init方法與對象的使用
"該方法是在對象產生後才會執行,只用來為對象進行初始化操作,可以是任意代碼,但不能有返回值"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Student:
school = ‘my_school‘
def __init__(self,name,sex,age):# 屬於對象的變量,在s1.__dict__中可查看到
self.name=name
self.sex=sex
self.age=age
def learn(self): #函數屬性
print(‘is learning‘)
def eat(self): #函數屬性
print(‘is eating‘)
def sleep(self):
print(‘is sleeping‘)
#加上__init__方法後,實例化的步驟
# 1.產生一個空對象s1
# 2.Student.__init__(s1,‘vita‘,‘女‘,27)
s1=Student
Student.__init__(s1,‘lyly‘,‘女‘,28)
s2=Student(‘vita‘,‘女‘,27)
s3=Student(‘chaochao‘,‘男‘,30)
#查
print("s1.__dict__",s1.__dict__)
print("s2.__dict__",s2.__dict__)
print("s3.__dict__",s3.__dict__)
print("查詢s2.name",s2.name)#等同於s2.__dict__["name"]
#改
s2.name="vita_new" #等同於s2.__dict__["name"]="vita_new"
print("修改後的s2.__dict__",s2.__dict__)
print("修改後的s2.name",s2.name)
#刪除
del s2.name #等同於s2.__dict__.pop("course")
print("刪除後的s2.__dict__",s2.__dict__)
#增加
s2.class_name="python" #等同於s2.__dict__["class_name"]="python"
print("增加後的s2.__dict__",s2.__dict__)
#是否對s3對象有所影響
print("操作後的s3.__dict__",s3.__dict__)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
s1.__dict__ {‘__module__‘: ‘__main__‘, ‘school‘: ‘my_school‘, ‘__init__‘: <function Student.__init__ at 0x0000018C0ED71C80>, ‘learn‘: <function Student.learn at 0x0000018C0ED71D90>, ‘eat‘: <function Student.eat at 0x0000018C0ED71D08>, ‘sleep‘: <function Student.sleep at 0x0000018C0ED7B158>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None, ‘name‘: ‘lyly‘, ‘sex‘: ‘女‘, ‘age‘: 28}
s2.__dict__ {‘name‘: ‘vita‘, ‘sex‘: ‘女‘, ‘age‘: 27}
s3.__dict__ {‘name‘: ‘chaochao‘, ‘sex‘: ‘男‘, ‘age‘: 30}
查詢s2.name vita
修改後的s2.__dict__ {‘name‘: ‘vita_new‘, ‘sex‘: ‘女‘, ‘age‘: 27}
修改後的s2.name vita_new
刪除後的s2.__dict__ {‘sex‘: ‘女‘, ‘age‘: 27}
增加後的s2.__dict__ {‘sex‘: ‘女‘, ‘age‘: 27, ‘class_name‘: ‘python‘}
操作後的s3.__dict__ {‘name‘: ‘chaochao‘, ‘sex‘: ‘男‘, ‘age‘: 30}
Process finished with exit code 0
3.4說明
1.站的角度不同,定義出的類是不同的
2.現實中的類並不完全等於程序中的類,比如現實中公司類,在程序中需要拆分為部門類,業務類
3.有時為了編程需求,程序中可能出現現實中不存在的類,但這在程序中是很普遍的,需要把現實與程序分別開來
類與對象的定義和使用(包含init講解)