1. 程式人生 > >Python:類

Python:類

定義方法:
    class類名:
        ...
類也是物件,它是能建立例項的物件

類變數

類變數是類的屬性,此屬性屬於類,不屬於此類的例項
作用:
    通常用來儲存該類建立的物件的共有屬性
說明:
    類變數可以通過該類直接訪問
    類變數可以通過類的例項直接訪問(取值)
    類變數可以通過此類的物件__class__屬性間接訪問
class human:
    total_count=0 #建立一個類變數
print('human.total=',human.total_count)
human.total_count+=100
print(human.total_count)  #100
human.class_var=200#建立第二個類變數

print(dir(human))
class human:
    total_count=0 #建立一個類變數
h1=human()#建立一個例項
print(h1.total_count)#0  h1沒有屬性訪問類變數

h1.total_count=100  #建立例項變數
print(h1.total_count)#100
class human:
    total_count=0 #建立一個類變數
    def __init__(self):
        self.__class__.total_count+=1
h1=human()#建立一個例項
l=[]
l.append(human())
l.append(human())
l.append(human)
print(human.total_count,'個物件')#3
例項方法和類方法都是類的變數(類變數)

類的文件字串:

類內第一個沒有賦值給任何變數的字串為類的文件字串
類的文件字串繫結在類的__doc__屬性上
示例:
    class dog:
        '''dog類的文件字串'''
        def infos(self):
            '''這是dog類內infos方法的文件字串'''

    >>>help(dog)
    >>>print(dog.__doc__)

類的__slots__列表:

作用:
    限定一個類建立的例項只能在固定的屬性(實際變數)
        不允許物件新增此列表以外的例項屬性
    訪問使用者因錯寫屬性名而發生程式錯誤
說明:
    __slots__屬性是一個列表,列表的值是字串
    含有__slots__屬性的類所建立的例項物件沒有
    __dict__屬性,即此例項不用字典來儲存例項屬性


# class human:
#     def __init__(self,n,a):
#         self.name=n
#         self.age=a
#     def show__info(self):
#         print(self.name,'今年',self.age,'歲')
# h1=human('tarena',15)
# h1.show__info()   #15歲
# h1.Age=16  #大寫Age
# h1.show__info()#15歲
# print(h1.__dict__)#{'name': 'tarena', 'age': 15, 'Age': 16}




class human:
	#此__slots__列表讓human建立的物件只允許有name和age屬性
	__slots__={'name','age'}#############__slots__
	def __init__(self,n,a):
    	self.name=n
    	self.age=a
	def show__info(self):
    	print(self.name,'今年',self.age,'歲')
h1=human('tarena',15)
h1.show__info()   #15歲
# h1.Age=16  #此處報錯,因為此屬性不在__slots__列表內
h1.show__info()#15歲

類方法@classmethod

類方法是用於描述類的行為的放法,此方法屬於類,不屬於該類建立的物件
說明:
    1.類方法需要使用@classmethod裝飾器定義
    2.類方法至少有一個形參,第一個形參用於繫結類,約定寫為‘cls’
    3.類和該類的例項都可以呼叫類方法
    4.類方法不能訪問此類建立的物件的例項屬性


class a:
    v=100 #類變數
    @classmethod
    def get_v(cls):  #cls-->class
        '''這是一個類方法,用來獲取類變數v的值'''
        return cls.v

    @classmethod
    def set_v(cls,b):
        cls.v=b

print(a.get_v())#100獲取類變數v的值
a.set_v(200)
print(a.get_v())#200

A=a()
#類和該類的例項都可以呼叫類方法
print(A.get_v())# 200   該類的例項可以呼叫類方法

靜態方法@staticmethod

靜態方法是定義在類內的函式,此函式的作用域是類的內部
說明:
    靜態方法需要使用@staticmethod裝飾器定義
    2.靜態方法與普通函式定義相同,不需要傳入self和cls引數
    3.靜態方法只能憑藉該類或類的例項呼叫
    4.靜態方法不能訪問類變數和例項變數
	**#此例項示意靜態方法的定義的使用**
    class A:
        @staticmethod
        def myadd(a,b):
            return a+b
    print(A.myadd(100,200))# 300呼叫靜態方法
    a=A()
    print(a.myadd(30,40)) #70
函式,靜態方法,類方法,例項方法
共性:
    語句塊,實現相應的功能