002--對象和類
對象和類
對象是什麽?
在面向對象編程中,對象大致意味著一系列數據(屬性)以及一套訪問和操作這些數據的方法。
對象:類的實例
類是什麽?
類即類別、種類,是面向對象設計最重要的概念。
類:一種對象,每個對象都屬於特定的類。
問題1:先有類還是先有對象?
先有的一個個具體存在的對象(比如一個具體存在的人),還是先有的人類這個概念,這個問題需要分兩種情況去看
- 在現實世界中:肯定是先有對象,再有類
- 在程序中:務必保證先定義類,後產生對象
創建自定義類
在Python中程序中的類:
- 用class關鍵字定義
- 關鍵字首字母大寫
- 特征用變量標識
- 技能用函數標識
因而類中最常見的無非是:變量和函數的定義
一個簡單的示例:
class Person: def set_name(self,name): self.name=name def get_name(self): return self.name def greet(self): print("hello,world! I am {}".format(self.name)) #創建兩個實例 foo=Person() bar=Person() foo.set_name("Lucy") bar.set_name("Jessie") foo.greet() bar.greet() #輸出 hello,world! I am Lucy hello,world! I am Jessie
從上面示例不難看出:
- 該示例包含三個方法,他們類似於函數定義,位於class語句內。
- self指向對象本身,例如:對foo調用set_name和greet時,foo都會作為第一個參數自動傳給他們。
實際上,可以隨便給這個參數命名,但鑒於它總是指向對象本身,因此習慣上將其命名為self。
類的使用
class OldboyStudent: school=‘oldboy‘ def learn(self): print(‘is learning‘) def eat(self): print(‘is eating‘) def sleep(self): print(‘is sleeping‘)
1、引用類的屬性
OldboyStudent.school #查 OldboyStudent.school=‘Oldboy‘ #改 OldboyStudent.x=1 #增 del OldboyStudent.x #刪
2、調用類
- 或稱為實例化,得到程序中的對象
s1=OldboyStudent() s2=OldboyStudent() s3=OldboyStudent() #如此,s1、s2、s3都一樣了,而這三者除了相似的屬性之外還各種不同的屬性,這就用到了__init__
3、__init__方法
#註意:該方法是在對象產生之後才會執行,只用來為對象進行初始化操作,可以有任意代碼,但一定不能有返回值 class OldboyStudent: ...... def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex ...... s1=OldboyStudent(‘李坦克‘,‘男‘,18) #先調用類產生空對象s1,然後調用OldboyStudent.__init__(s1,‘李坦克‘,‘男‘,18) s2=OldboyStudent(‘王大炮‘,‘女‘,38) s3=OldboyStudent(‘牛榴彈‘,‘男‘,78)
對象的使用
1、查看對象的名稱空間
- cls.__dict__
#執行__init__,s1.name=‘牛榴彈‘,很明顯也會產生對象的名稱空間可以用s2.__dict__查看,查看結果為 print(s2.__dict__) {‘name‘: ‘王大炮‘, ‘age‘: ‘女‘, ‘sex‘: 38}
2、對象的屬性
s2.name #查,等同於s2.__dict__[‘name‘] s2.name=‘王三炮‘ #改,等同於s2.__dict__[‘name‘]=‘王三炮‘ s2.course=‘python‘ #增,等同於s2.__dict__[‘course‘]=‘python‘ del s2.course #刪,等同於s2.__dict__.pop(‘course‘)
補充說明
- 站的角度不同,定義出的類是截然不同的;
- 現實中的類並不完全等於程序中的類,比如現實中的公司類,在程序中有時需要拆分成部門類,業務類等;
- 有時為了編程需求,程序中也可能會定義現實中不存在的類,比如策略類,現實中並不存在,但是在程序中卻是一個很常見的類
函數 V.S 方法
方法(關聯方法)將其第一個參數關聯到它所屬的實例,因此無需提供這個參數。當然可以將屬性關聯到一個普通函數,但這樣就沒有特殊的self參數了
舉個例子:
1、類屬性關聯到函數:
class Class:
def method(self):
print("I have a self")
def function():
print("I don‘t have self...")
instance=Class()
instance.method()
#輸出結果
I have a self
instance.method=function
instance.method()
#輸出結果
I don‘t have self...
註意:有沒有參數self並不取決於instance.method的調用方法
2、讓另一個變量指向同一個方法
class Class:
def method(self):
print("I have a self")
def function():
print("I don‘t have self...")
instance=Class()
ins=instance.method
ins()
#輸出結果
I have a self
雖然最後一個方法調用起來看起來像函數調用,但變量ins指向的是關聯的方法instance.method,這意味著它也能夠訪問參數self(即它也被關聯到類的實例)
Mark on 2018.04.12
002--對象和類