2018-10-18面向類和對象2

recode
1,class 類名(父類):
類的內(nèi)容
2.對象:類的實例(具體)
對象 = 類名()
3.構(gòu)造方法和init方法
構(gòu)造方法:聲明類的時候,系統(tǒng)會自己創(chuàng)建一個函數(shù),這個函數(shù)和類名一樣。這個方法就是構(gòu)造方法。
構(gòu)造的作用就是創(chuàng)建對象,并且自動調(diào)用構(gòu)造方法 init方法 :系統(tǒng)在創(chuàng)建對象的時候自動調(diào)用。

可以有除了self、以外的其它參數(shù)
需要給類添加對象屬性的時候

class Person:
    num = 1
    def __init__(self,name,age):

        print(self)
        print('aaaaa')

def func1(name,age):
    print(name,age.sex)
                        
def func2(*args,**kwargs):

對象方法:直接聲明在類中的函數(shù)就是對象方法,有默認(rèn)參數(shù)self,并且要通過參數(shù)的小紅
對象的屬性:聲明在init方法中
self.屬性 = 值

類的字段(類的屬性):只能聲明變量或者聲明函數(shù)
聲明在類中,在函數(shù)的外面的變量;通過類來使用(不管在哪用)

dict

class Person:
    num = 61
    __slots__ = ('name','age','sex')
    def __init__(self,name,age = 10,sex = 'boy'):
        self.name = name

        self.age = age

        self.sex = sex

p1 = Person('老余')
p2 = Person('老張',18)
p3 = Person('老龍',22,'爺們')

類中方法:對象方法、類方法和靜態(tài)方法

對象方法:
a.直接聲明在類中的
b.自帶參數(shù)self
c.通過對象來調(diào)用

2.類方法
a.聲明在@classmethod后面的函數(shù)就是類方法
b.自帶一個參數(shù)cls(cls在函數(shù)調(diào)用的時候不用傳參,系統(tǒng)會自動調(diào)用這個方法的類)
c.通過類來調(diào)用

3.靜態(tài)方法:
a.申明在@staticmethod后面的函數(shù)就是靜態(tài)方法
b.沒有自帶的參數(shù)
c.通過類來調(diào)用

4.怎么選擇使用哪種方法:(重點)

如果實現(xiàn)函數(shù)的功能需要用到對象的屬性,那么就把這個函數(shù)聲明成對象方法

反之,如果你的功能用不上對象的屬性,聲明成類方法或者靜態(tài)方法都可以

靜態(tài)方法和類方法:實現(xiàn)函數(shù)的功能不需要用到對象的屬性,就可以選擇用靜態(tài)或者類方法

類方法:在不使用對象屬性的前提下,需要使用類就可以用類方法

靜態(tài)方法:既不需要對象的屬性也不需要類,

class Number:
    def __init__(self):
        self.value = 0
        self.type = int
        self.id = None

    @staticmethod
    def max():
        return  100
    @staticmethod
    def min():
        return  -100
num = Number()
num.value = 1000
print(Number.max())
class Math:

    π = 3.1415926

    @classmethod
    def circle_ared(cls,radius):

        return cls.π * radius ** 2
    @staticmethod
    def sum(num1, num2):
        return num1 + num2
class Rect:
    def __init__(self,lenth,whdtu):
        self.lenth = lenth
        self.whdtu = whdtu
        def area(self):
            return  self.lenth*self.width
class Person:
    num = 61
    # 聲明一個類方法
    @classmethod
    def destroy(cls):
        # cls 只想的是當(dāng)前類。調(diào)用這個方法的類可以做的。cls都能做
        print('cls',cls,cls.num)
        p2 = cls()
        print('人類破壞環(huán)境')
        #聲明一個靜態(tài)方法
    @staticmethod
    def func1():
        print(Person.num)
        p3 = Person()
        print(p3)
        print('人類的靜態(tài)方法')

class Student(Person):
    pass

(大家都是成年人,都是靠自覺)
類中的內(nèi)容默認(rèn)是公開的(在類的外面可以使用)
1、私有化:
將類的內(nèi)容在類的外部隱藏
在類中方法名或者屬性名前加倆下劃線
私有的方法和屬性只能在類的內(nèi)部使用,不能在類的外部使用

私有的原理
python中沒有真正的私有化(沒有從訪問權(quán)限上去限制內(nèi)容的訪問
私有的原理就是在私有的屬性名前加個前綴'_類名'來阻止外部訪問

class Person:
    num  = 61
    def __init__(self,name,age):
        self.name = name
        self.__age = age

    def show_info(self):
        print(self.__age)
        self.__func1()


    def __func1(self):
        print('私有')

p1 = Person('阿曾', 22)
print(p1.name)
p1.show_info()

print(p1.__dict__)
print(p1._Person__age)

1.什么時候需要添加對象屬性的getter和setter
如果希望在通過對象.屬性獲取屬性的值之前,在干點別的事情,就可以給這個屬性添加getter
如果希望在通過對象.屬性給屬性賦值之前,在干點別的事兒,就可以這個屬性添加setter
2.怎么添加setter 和 gett
getter:
屬性名前+_ 加一個下劃線,
b,添加屬性對應(yīng)的grtter
@property
def 屬性名去掉_(self):
函數(shù)體--》會對屬性的值進(jìn)行處理后返回相應(yīng)的結(jié)果(必須要有返回值)

c.使用屬性的值的時候,不通過帶下劃線的屬性名,而是通過沒有下劃線的屬性去使用

注意:對象。不帶下劃線的屬性 --》調(diào)用getter對應(yīng)的函數(shù)
setter
如果想要添加setter 必須先添加 getter
@getter名。sett
def 屬性名去掉_(self,參數(shù)):
做別的事情
self.屬性名= 處理后的值

# class Person:
#     def __init__(self):
#         self.name
#         self.age
#賦值時要求age的值只能在0~150之間超過范圍報錯:獲取age的值的時候,返回年齡值。
          # 并且返回這個年齡對應(yīng)的階段

# print(p1.age)
class Number:
  def __init__(self):
      self._value = 0
      self._week = 3
      self.type = int
      self.id = None
    # _value添加gett和setter
    @property
    def value(self):
        return self._value

    @value.setter
    def value(self,x):
        if not -100 <= x <= 100:
            raise ValueError
        self._value = x
    @property
    def week(self):
        if self._week == 0:
            return '星期天'
        elif self._week == 1:
            return '星期一'
        elif self._week == 2:
            return '星期二'
        elif self._week == 3:
            return '星期三'
        elif self._week == 4:
            return '星期四'
        elif self._week == 5:
            return '星期五'
        elif self._week == 6:
            return '星期六'
    # inisstance(值,類)--》判斷指定的值是否是指定類型
    @week.setter
    def week(self,value):
        if not isinstance(value,int):
            raise ValueError
        if not 0 <= value <= 6:
             raise ValueError

        self._week = value
number = Number()
number.value = 3
print(number.week)# number .week 實質(zhì)是通過number調(diào)用對象方法week
number.week = 1 # 通過number.week = 值 實質(zhì)是通過number去掉用setter對應(yīng)的week的方法

number.value = 5
print(number.value)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,194評論 8 265
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,115評論 2 9
  • 《醉翁亭記》教學(xué)片段摘選 一 上歐陽修《醉翁亭記》一文。我自得其樂地為學(xué)生背誦了一遍,讓學(xué)生練讀一遍,然后又讓學(xué)生...
    新我語文閱讀 164評論 0 1
  • 聽說世界會有平行時空,現(xiàn)在的前一秒會有個平行的我在經(jīng)歷著,那么請你聽好下面我說的話。 ...
    韓euy閱讀 188評論 0 0

友情鏈接更多精彩內(nèi)容