Day15類和對象2

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

1.對象方法:

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)方法和類方法:實現(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:
    pi = 3.1415926

    @classmethod
    def circle_area(cls,radius):
        return cls.pi * radius ** 2

    @staticmethod
   def sum(num1, num2):
        return num1 + num2




print(Math.circle_area(3))
print(Math.circle_area(4))


class Rect:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width


class Person:
    num = 61
    # 聲明一個類方法
    @classmethod
    def destroy(cls):
        # cls指向的是當(dāng)前類设联。調(diào)用這個方法的類可以做的事情,cls都能做
        print('cls:',cls, cls.num)
        p2 = cls()
        print(p2)
       print('人類破壞環(huán)境')

    # 聲明一個靜態(tài)方法
    @staticmethod
    def func1():
        print(Person.num)
        p3 = Person()
         print(p3)
         print('人類的靜態(tài)方法')

私有化

類中的內(nèi)容默認(rèn)都是公開的(在類的外面可以使用)

1.私有化 - 將類的內(nèi)容在類的外面隱藏

在類中方法名或者屬性名前加兩個下劃線(不能以兩個下劃線結(jié)束)
私有的方法和屬性只能在類的內(nèi)部使用换团,不能在類的外部使用

2.私有的原理

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('小明', 23)
    print(p1.name)
    p1.show_info()
    # print(p1.__age)
    
    # print(Person.__num)
    print(p1.__dict__)
    print(p1._Person__age)

getter和setter

1.什么時候需要添加對象屬性的getter和setter

如果希望在通過對象.屬性獲取屬性的值之前宫蛆,再干點兒別的事情艘包,就可以給這個屬性添加getter耀盗。
如果希望在通過對象.屬性給屬性賦值之前,再干點兒別的事情叛拷,就可以給這個屬性添加setter

2.怎么添加setter和getter

getter:

a.在屬性名前加_
b.添加屬性對應(yīng)的getter
@property
def 屬性名去掉_(self):
函數(shù)體 --> 會對屬性的值進行處理后,返回相應(yīng)的結(jié)果(必須要有返回值)

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

注意:對象.不帶下劃線的屬性 --> 調(diào)用getter對應(yīng)的函數(shù)

setter:

如果想要添加setter必須要先添加getter
a.添加setter
@getter名.setter
def 屬性名去掉_(self, 參數(shù)):
做別的事情
self.屬性名 = 處理后的值

class Number:
    def __init__(self):
        self._value = 0
        # 0-6保存
        self._week = 3
        self.type = int
        self.id = None

    # _value添加getter和setter
    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, x):
        if not -100 <= x <= 100:
            raise ValueError
        self._value = x




    # _week的getter
    @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 '星期六'

    """
    isinstance(值, 類) --> 判斷指定的值是否是指定類型(返回值是bool)
    """
    @week.setter
    def week(self, value):
        # 如果傳的值不是整型數(shù)據(jù)
        if not isinstance(value, int):
            raise ValueError
        if not 0 <= value <= 6:
            raise ValueError

        self._week = value



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


number.value = 100
print(number.value)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骇陈,一起剝皮案震驚了整個濱河市瑰抵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖婿崭,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渣磷,居然都是意外死亡,警方通過查閱死者的電腦和手機醋界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門提完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來形纺,“玉大人徒欣,你說我怎么就攤上這事逐样〈蚋危” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵粗梭,是天一觀的道長。 經(jīng)常有香客問我断医,道長,這世上最難降的妖魔是什么孩锡? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮浇垦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘男韧。我一直安慰自己,他們只是感情好默垄,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朦前,像睡著了一般介杆。 火紅的嫁衣襯著肌膚如雪韭寸。 梳的紋絲不亂的頭發(fā)上春哨,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天恩伺,我揣著相機與錄音,去河邊找鬼晶渠。 笑死,一個胖子當(dāng)著我的面吹牛褒脯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憨颠,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼积锅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缚陷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箫爷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虎锚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡窜护,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缓屠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌完,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滨溉,到底是詐尸還是另有隱情,我是刑警寧澤晦攒,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站勤家,受9級特大地震影響腹尖,放射性物質(zhì)發(fā)生泄漏伐脖。R本人自食惡果不足惜热幔,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一讼庇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠕啄,春花似錦、人聲如沸歼跟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骚秦,卻和暖如春她倘,著一層夾襖步出監(jiān)牢的瞬間作箍,已是汗流浹背硬梁。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工胞得, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懒震。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像个扰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子递宅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359