Python--(類和對象 上篇)

一、概念

:具有相同的屬性和方法的對象的集合.它定義了該集合中每個對象所共有的屬性和方法.

對象:萬物皆對象

關係

類包含屬性和方法

類是對像的模板

對象是類的事例

二、語法

class 類名:

屬性

對象屬性-->私有  共有

類屬性-->私有  共有

方法

<1>公有方法

<2>私有方法

<3>屬性方法

<4>靜態方法

三、封裝

創建對象

創建對象:屬性寫在類外的情況,通過對象.屬性,對象.方法()的方式調用 

<1>無參函數的調用(需要每個去賦值,比較囉嗦)

例:

 
class Person:
    #屬性   方法
    '''
    def聲明方法的標識
    eat 函數名 方法名
    () 形參列表 形參:形式列表 (定義概念)
    self 第一個參數 默認是當前對象的引用=地址指向
    '''
    def eat(self):
        print('人在方法')
    def sleep(self):
        print('吃完睡覺')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.eat()
    zhangsan.sleep()

執行命令得

 
人在方法
吃完睡覺

初始化:

<2>__init__(self):系統自動調用初始化方法,先生成對像,再調用此方法,再將對象賦值給引用名

用法:

def __int__(self,v_name,v_age):

    self.name=v_name

    self.age=v_age

有參函數的調用(可以直接全部賦值,比較簡潔)

例:

 
class Person:
    '''
    帶參-函數
    '''
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print('__init__ Person')
    def eat(self):
        print(self.name+'在吃飯')
    def sleep(self):
        print(self.name+'吃完睡覺')
    def hello(self):
        print('大家好,我是'+self.name+'  今年',self.age)
if '__main__'.__eq__(__name__):
    zhangsan=Person('張三',19)#直接賦值參數
    zhangsan.eat()
    zhangsan.sleep()
    zhangsan.hello()

執行命令得

 
__init__ Person
張三在吃飯
張三吃完睡覺
大家好,我是張三  今年 19

<3>重寫;當需求系統自帶不能滿足時需要用到重寫,即自己編寫的規則

__str__():

    return  xxx

 
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        #object 所有數據類型的基類 父類
        return 'name:'+self.name+'age:'+str(self.age)
if '__main__'.__eq__(__name__):
    zhangsan=Person('張三',19)
    print(zhangsan)
    print(str(zhangsan))#對上面未聲明__str__函數時輸出結果與 id相同
    print(zhangsan.__str__())
    print(id(zhangsan))

執行命令得

 
name:張三age:19
name:張三age:19
name:張三age:19
90743856

<4>屬性相對於類來說屬於全局 即:每個方法都可以調用

get/set方法:不寫__init__()方法

set_name(self,new_name):

    self.name=new_name

get_name(self);

    return self.name

解釋性語言:不需要預定義  隨時創建隨時使用

 
class Student:
    def set_name(self,name):
        self.name=name
    def get_name(self):
        return self.name
stu=Student()
stu.set_name("abc")#邊執行邊解釋 或者寫成 stu.name='abc'
print(stu.get_name())

執行命令得

 
abc

 封裝

 
class Person:
    def setage(self,new_age):
        '''
        封裝的意義  doc 註釋==>文檔註釋
        :param new_age: 新的年齡 0--100
        :return: None
        '''
        if new_age<0 or new_age>100:
            print('超出年齡限制 默認18')
            self.__age__=18
        else:
            self.__age__=new_age
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.setage(1000)
    print('age:',zhangsan.__age__)

執行命令得

 
超出年齡限制 默認18
age: 18

四、

<1>公有方法;從外部直接調取的都是公有

私有方法:只能在內部調用,外部不允許訪問(可以調用不是絕對的,一切靠自覺)

               例如:__private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs

<2>自動銷燬方法:

1.__del__():

 xxx

當獨想沒有引用的時候,或程序結束的時候,程序自動調用__del__()

2.del 引用  科顏氏刪除時自動調用__del__()

3.程序結束時自動調用__del__()

 
class Person:
    def __show__(self):
        print('哈哈')
    def __del__(self):#自動刪除
        print('對象被刪除..資源被釋放')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.__show__()
    lisi=zhangsan
    del zhangsan#手動刪除
    for i in range(5):
        print(i)

執行命令得

 
哈哈
0
1
2
3
4
對象被刪除..資源被釋放

<3>測試一個對象有多少個引用(有多少引用指向同一塊空間)

import sys#導入

t=T()#引用

sys.getrefcount(t)返回 從2開始  #ref 引用傳遞

 
import sys
class Person:
    def __show__(self):
        print('哈哈')
if '__main__'.__eq__(__name__):
    zhangsan=Person()
    zhangsan.__show__()
    lisi=zhangsan
    print(sys.getrefcount(zhangsan))

執行命令得

 
哈哈
3

五、Python變量的命名規則  數字 /字母/ _ 

首字母不能是數字開頭

非硬性要求規範:首字母小寫 其餘首字母大寫

不能使用關鍵字

一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照規定俗稱的規定,當你看到這樣的變量時,意思就是"雖然我可以被訪問,但是,請把我視爲私有變量,不要隨意訪問".

雙下劃綫開頭的實例變量是不是一定不能在外部訪問呢?

其實也不是.不能直接訪問__name是

 
class Person:
    def  __init__(self,name):
        self.__name=name
if '__main__'.__eq__(__name__):
    zhangsan=Person('張三')
    print(zhangsan._Person__name)

執行命令得

 
張三

因爲Python解釋器對外把__name變量改成了_類名__name.所以仍然可以通過_類名__name來訪問__name變量:

對一個對象的引用調用id()函數,可以得到該對象的標識符(dentity).該標識符是一個整數,它保證在該對象的生命週期內是唯一的和恆定的.具有不重疊生命週期的兩個對象具有不同的id()值.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章