類和對象安全
類編輯器
類:具備相同屬性和方法的對象的集合;函數
對象:萬物皆對象;測試
語法:spa
#class 類名: #屬性 #方法
class Person: def eat(self): print("正在吃飯"); def sleep(self): print("正在睡覺");
class Student:#類的命名不能使用除下劃線之外的其餘字符,不能以數字開頭,以大小寫分割單詞 pass#用於保證合適完整,保證語義完整
屬性:.net
屬性寫在類外的狀況,就是經過對象.屬性,對象.方法()的方法調用orm
對象的三要素:屬性(對象是什麼)、方法(對象能作什麼)、事件(對象如何響應)對象
相互關係:類是對象的抽象,對象是類的實例,類是一種抽象事物的分類,對象是一種實例;事件
class Student: def __init__(self,name,age): self.name=name; self.age=age; def showName(self): print("我叫{}".format(self.name)); zhangsan=Student('張三',30); zhangsan.showName();
class Student: def showName(self): print("我叫{}".format(self.name)); zhangsan=Student(); zhangsan.name='張三'; zhangsan.showName();
class Student: def showName(self): print("我叫{}".format(self.name)); zhangsan=Student(); zhangsan.name='張三'; zhangsan.name='ok';#第二個值會覆蓋第一個值 zhangsan.showName();
__init__(self):系統自動調用初始化方法,先生成對象,再調用此方法,再將對象賦值給引用名內存
class Person: def __init__(self,name,age): self.name=name; self.age=age; print("執行init時就被調用了"); p=Person("ok",20); print(p.name); print(p.age); #執行結果: #執行init時就被調用了 #ok #20
__new__(cls,*agrs,**kwargs):在類調用init方法時,new方法決定是否要用init方法,由於new能夠調用其餘類的方法,或者返回別的對象來做爲本類的實例;
new()方法的特性:
new()方法時在類準備將自身實例化時調用;
new()方法始終都是類的靜態方法,即便沒有被加上靜態方法裝飾器;
class Student: def __new__(cls, *args, **kwargs): print("執行__new__",args[0],args[1]); return object.__new__(cls);#固定語法 def __init__(self,name,age): print("執行__init__",name,age); self.name=name; self.age=age; def showName(self): print("姓名:{}".format(self.name)); zhangsan=Student("張三",22); zhangsan.showName();
對象屬性:私有和共有
若是有一些屬性不想給外部權限來訪問或者修改,能夠在屬性或者方法的名字前加倆下劃線__,聲對象屬性明爲私有屬性。則在外部調用該屬性時返回ValueError.
class Person(object): def __init__(self, name): self.name = name; self._title = 'Mr'; self.__job = 'Student';#"__"聲明爲私有屬性 p = Person('Bob'); print (p.name); print (p._title); print (p.__job);
封裝
class Student: def __new__(cls, *args, **kwargs): print("執行__new__",args[0],args[1]); return object.__new__(cls);#固定語法 def __init__(self,name,age): print("執行__init__",name,age); self.name=name; self.__age=age; def getAge(self): return self.__age; def setAge(self,age): if age<0 or age>100: self.__age=18; else: self.__age=age; def showName(self): print("姓名:{}".format(self.name)); zhangsan=Student("張三",20); print('他的年齡',zhangsan.getAge()); zhangsan.setAge(40); print('他的年齡',zhangsan.getAge());
__del__():自動銷燬方法
class Person: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print("對象張三被銷燬") zhangsan = Person("張三", 20) zhangsan.__del__();
測試一個對象被引用多少次:import sys(寫在編輯器的頂端,起引入包的做用)
import sys#此行代碼需寫在編輯器頭部 class Person: def __init__(self,name,age): self.name=name; self.age=age; zhangsan=Person("張三",20); print(sys.getrefcount(zhangsan));
訪問私有屬性能夠經過 對象._類名__屬性訪問到(不建議用這個方法)
id()函數 查看對象的內存地址:print(id());
類屬性:屬於類成員,對象共有的;
類方法:cls 代表是 類
在方法上添加 @classmethod裝飾器
def class_method(cls):
能夠經過類方法調用類屬性,也能夠經過對象調用類屬性;
修改類屬性的2種方式:1.類名.類屬性=... 2.實例對象__class__類屬性=...
靜態方法:前面加@staticmethod,靜態方法能夠加參數,與類和對象都沒有關係,也能夠經過類和對象調用;
class Person: @staticmethod def goHome(self, name, by): print(name, "回家...", by) Person.goHome("1","ok","自行車");
dir() :展現一個類/對象的內部屬性和函數
__dir__ :展現一個類/對象的內部屬性和函數
print(dir(zhangsan)); print(zhangsan.___dir___());