類:python
Python中的類是一個抽象的概念,甚至比函數還要抽象。能夠把它簡單的看做是數據以及由存取、操做這些數據的方法所組成的一個集合。類是Python的核心概念,是面向對象編程的基礎。編程
類有以下的優勢:ssh
類對象是多態的:也就是具備多種形態,意味着咱們能夠對不一樣的類對象使用一樣的操做方法,而不須要額外編寫代碼。函數
類的封裝:類封裝以後,能夠直接調用類的對象來操做內部的一些類方法,不須要讓使用者看到代碼工做的細節。ui
類的繼承:類能夠從其餘類或者基類中繼承它們的方法,直接使用。spa
(1) 類的定義:orm
類是對現實世界中一些事物的封裝,Python中定義類是經過class關鍵字,緊跟着的是類名(類名一般是大寫字母開頭的單詞)和冒號,隨後是定義類的類體代碼。對象
類定義的語法格式以下:繼承
class Classname(object): #(object)表示該類是從哪一個類繼承下來的,一般若是沒有合適的繼承類,就使用object類,這是全部類最終都會繼承的類。索引
"""documentation string"""
<statement_1>
<statement_2>
...
<statement-N>
示例1:類的定義
class People:
#定義基本屬性
name='' #name、age是類的公有屬性
age=0
#定義私有屬性,私有屬性在類外部沒法直接進行訪問,可是能夠在內部使用self.__weight來調用。
__weighe=0
#定義構造方法,用於初始化類的內部狀態,爲類的屬性設置默認值:
def __init__(self,n,a,w):
self.name=n
self.age=a
self.__weight=w
#定義一個函數,爲類的函數,稱爲方法;它至少有一個參數self:
def speak(self):
print('%s is speaking:i am %d years old.'%(self.name,self.age))
#類調用
p=people('Tom',10,30)
p.speak() #返回:Tom is speaking:i am 10 years old.
(2) 類屬性與方法
使用類的主要緣由之一是對象能夠組合在一塊兒並綁定在一個共同對象上。
如:q=RationalNumber(10,20) #實例化(instantiation),建立p實例
q.numerator #屬性引用/訪問(attribute access)
q.denominator
分子和分母是綁定到RationalNumber 類的實例的兩個對象,它們被稱爲實例的屬性。從對象引用的方式來看,「對象時類實例的屬性」。
r=RationalNumber(10,20)
q.numerator=17
del r.denominator
代表一旦定義了一個實例,就能夠設置、更改或者刪除該特定實例的屬性。注意:更改或刪除屬性可能會有不但願有的反作用,甚至可能使對象無效。
① 類的公有屬性:public_attrs:符合正常的變量命名規則,開頭沒有下劃線,在來的外部能夠直接進行訪問
② 類的私有屬性:__private_attrs:由兩個下劃線開頭,聲明該屬性爲私有,不能在類的外部被使用或者直接訪問。在類內部的方法中使用時的格式爲:self.__private_attrs.
③ 類的構造方法:
__init__():叫作構造函數或者構造方法,它在生成一個對象時被自動調用。
如上例1中,p=people('Tom',10,30)語句就是調用__init__方法,將參數傳遞給self.name、self.age、self.__weight
要爲示例類提供一些屬性,即爲其提供定義數據。在例中,該數據將是分子和分母的值。爲此,必須定義一個方法__init__,用於初始化具備這些值的類。
示例2:
class RationalNumber:
def __init__(self,numerator,denominator):
self.numerator=numerator
self.denominator=denominator
###在說明添加到類中的特殊__init__函數以前,要展現RationalNumber對象的實例化。
q=RationalNumber(10,20)
print(q.numerator) #返回 10
print(q.denominator)
#返回 20
#類型RationalNumber的新對象經過使用類名稱來建立,就像它是一個函數同樣。
語句執行兩個操做:首先建立一個空對象,而後將__init__函數應用到該空對象,即執行q.__init__(10,20).
__init__的第一個參數是指新對象自己。在函數調用中,其第一個參數被對象的實例所替代。第一參數的特殊做用體如今將其命名爲self的慣例上。
④ 類的公有方法:
public_method()--在類的內部,使用def關鍵字能夠爲類定義一個辦法,與通常函數定義不一樣,類方法必須包含參數self,且爲第一個參數。self在Python中不是關鍵字,它表明當前對象的地址。
⑤ 類的私有方法:
__private_method():由兩個下劃線開頭,聲明該方法爲私有方法,不能在類的外部進行調用。在類的內部調用時格式爲self.__private_methods()
⑥ 單下劃線(_):
以單下劃線開始的成員變量叫做保護變量意思是隻有類對象和子類對象本身可以訪問到達這些變量。
⑦ 類的專有方法:
__init__:構造函數
__del__;析構函數,釋放對象時使用
__repr__:打印,轉換
__setitem__:按照索引賦值
__getitem__:按照索引獲取值
__len__:獲取長度、__cmp__:比較運算、__call__:函數調用、
__add/sub/mul/div/mod/pow__:加運算/減運算/除運算/求餘運算/乘方運算。
__str__:字符串方法
其中:__repr__的特殊方法使咱們可以定義對象在Python解釋器中的表示方式
class RationalNumber:
def __init__(self,numerator,denominator):
self.numerator=numerator
self.denominator=denominator
def __repr__(self):
return("{}/{}".format(self.numerator,self.denominator))
q=RationalNumber(10,20)
print(q) #只要輸入q就會返回10/20。
2. Python類與對象
(1) 認識其區別:Python裏一切都是對象,實例是對象,類是對象,元類也是對象。實例是對象,建立實例的是類;類是對象,建立類的是元類。
在Python中,一個對象的特徵稱爲屬性,它所具備的行爲稱爲方法。即,對象=屬性+方法。
把具備相同屬性和方法的對象歸爲一個類,例如:人類、動物、植物等都是類的概念。
類是對象的模板或者藍圖,類是對象的抽象化,對象是類的實例化。類不表明具體的事物,而對象表明具體的事物(類是對客觀世界中事物的抽象,而對象是類實例化後的實體)。
(2) 對象的建立
建立對象的過程爲實力化,當一個對象被建立後,包含三個方面的特性:對象的句柄、屬性和方法。對象的句柄用於區分不一樣的對象。
例如:if __name__=="__main__" #當程序做爲主程序運行
fruit=Fruit() #實例化fruit:建立一個對象,建立了一個fruit對象
fruit.grow() #對象調用grow()方法
(3) 類對象支持兩種操做:屬性引用和實例化。類對象的屬性引用使用標準的語法:obj.name.類對象建立後,類命名空間中全部的命名都是有效屬性名。
在python中方法定義在類的定義中,但只能被類對象的實例所調用。調用一個方法的途徑分三步:
l 定義類和類中的方法
l 建立一個或者若干個實例,即將類實例化
l 用所建立的實例調用方法
實例:
class MyClass: #定義類和類中的方法
"""一個簡單的類實例"""
i=12
def f(self):
return("hello world")
#實例化類
MyClass1=MyClass()
#訪問類的屬性與方法,MyClass1.i和MyClass1.f()都是有效的屬性引用,分別返回一個整數和一個方法對象。
print("My Class類的屬性i爲:",MyClass1.i)
print("MyClass類的方法f輸出爲:",MyClass1.f()) #用建立的實例調用方法
#能夠對類屬性賦值,便可以經過給MyClass.i賦值來修改它
MyClass1.i=56
print("修改後My Class類的屬性i爲:",MyClass1.i)
(4) 類的屬性:數據屬性和特殊類屬性。
數據屬性:與局部變量同樣,數據屬性不須要聲明,第一次使用時它們就會生成。
例如:類數據屬性說明
class foo(object):
f=100
print(foo.f)
print(foo.f+1) #運行結果: 100
101
特殊類屬性:
對任何類foo,它的部分特殊屬性以下所示:
foo_name_ 類foo的名字(字符串)
foo_doc_ 類foo的文檔字符串
foo_bases_ 類foo的因此父類構成的元組
foo_module_ 類foo定義所在的模塊
foo_class_ 實例foo對應的類
例如:
class MyClass(object):
'MyClass 類定義'
myVer='3.4'
def showMyVer(self):
print(MyClass.myVer)
print(dir(MyClass))
print(MyClass.__dict__)
#返回結果:
dir()返回的僅是對象屬性的一個名字列表
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'myVer', 'showMyVer']
__dict__返回的是一個字典,它的鍵是屬性名,值是相應屬性的數據值。
{'__module__': '__main__', '__doc__': 'MyClass 類定義', 'myVer': '3.4', 'showMyVer': <function MyClass.showMyVer at 0x00000000071B5F28>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>}
print(MyClass.__class__) #返回MyClass
print(MyClass.__doc__) #返回MyClass類定義
print(MyClass.__module__) #__main__
實例屬性:內建函數dir()能夠顯示類屬性,一樣還能夠打印全部的實例屬性。
class foo(object):
pass
foo_1=foo()
print(dir(foo_1))
#返回結果:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']