一、概念
類:具有相同的屬性和方法的對象的集合.它定義了該集合中每個對象所共有的屬性和方法.
對象:萬物皆對象
關係
類包含屬性和方法
類是對像的模板
對象是類的事例
二、語法
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()值.