python類和對象、__init__(self)、__new__(cls,*agrs,**kwargs)、對象屬性、__del__()

類和對象安全

編輯器

  • 類:具備相同屬性和方法的對象的集合;函數

  • 對象:萬物皆對象;測試

  • 語法:spa

  • #class 類名:
     #屬性
     #方法
  • 定義一個類:
  • class Person:
        def eat(self):
            print("正在吃飯");
        def sleep(self):
            print("正在睡覺");
  • class Student:#類的命名不能使用除下劃線之外的其餘字符,不能以數字開頭,以大小寫分割單詞
        pass#用於保證合適完整,保證語義完整

屬性:.net

  • 概念:用於訪問類字段的成員;
  • 屬性用途:保證數據的安全,做數據的驗證;
  • 屬性名:使用名詞,說明操做對象、首字母小寫、以大寫字母分割單詞
  • 方法名:
  • 使用謂詞(動詞+對象),說明對什麼對象進行什麼操做
  • 首字母小寫
  • 以大寫字母分隔單詞
  • updatePhone、a
  • 屬性相對於類來講屬於全局,每一個方法均可以調用;
  • 屬性分歸屬 : 類屬性和對象屬性
  • 屬性寫在類外的狀況,就是經過對象.屬性,對象.方法()的方法調用orm

  • 對象的三要素:屬性(對象是什麼)、方法(對象能作什麼)、事件(對象如何響應)對象

  • 相互關係:類是對象的抽象,對象是類的實例,類是一種抽象事物的分類,對象是一種實例;事件

  • 對象屬性的兩種建立方法:
  • 一、self:對象的載體
  • 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);

封裝

  • 一、私有化
  • 二、設置get() set()方法
  • get()和set()
  • 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(寫在編輯器的頂端,起引入包的做用)

  • 語法:sys.getrefcount(t)返回 從2開始
  • 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___());
相關文章
相關標籤/搜索