類屬性與實例屬性
類屬性就是類對象所擁有的屬性,它被全部類對象的實例對象所共有,在內存中只存在
一個副本。
在前面的例子中咱們接觸到的就是實例屬性(對象屬性),它不被全部類對象的實
例對象所共有,在內存中的副本個數取決於對象個數。數據庫
import random class Turtle(object): # power是類屬性。 power = 100 def __init__(self): # x,y:實例屬性. self.x = random.randint(0, 10) self.y = random.randint(0, 10) #1). 類屬性無論有多少個對象, 都只存儲一份。 實例屬性存儲的個數取決於實例的個數. #2). 做用域不一樣: # 類屬性: 經過類名/對象名來訪問 # 實例屬性: 只能經過對象名來訪問。 print(Turtle.power) turtle1 = Turtle() print(turtle1.power, turtle1.x, turtle1.y)
類方法與靜態方法br/>類方法是類對象所擁有的方法,須要用修飾器通常以@classmethod來標識其爲類方法,
1). 對於類方法,第一個參數必須是類對象,做爲第一個參數
(cls是形參, 能夠修改成其它變量名,但最好用'cls'了)
2). 可以經過實例對象和類對象去訪問。br/>類方法與靜態方法
靜態方法須要用修飾器通常以@staticmethod來標識其爲靜態方法,
1). 靜態方法不須要多定義參數
2). 可以經過實例對象和類對象去訪問。dom
"""ide
1). @classmethod: 類方法 2). @staticmethod:靜態方法 """ import random class Turtle(object): def __init__(self): # x,y:實例屬性. self.x = random.randint(0, 10) self.y = random.randint(0, 10) self.power = 100 #默認狀況下, Python解釋器會自動將對象傳遞給類裏面定義的方法。 def eat(self): print("self: ", self) self.power += 20 @classmethod def cls_example(cls): print("cls: ", cls) @staticmethod def static_example(): print("靜態方法.......") turtle = Turtle() turtle.eat() turtle.cls_example() turtle.static_example() #類方法可以經過實例對象和類對象去訪問。 Turtle.cls_example() #靜態方法可以經過實例對象和類對象去訪問。 Turtle.static_example()
import time '''''' #系統自帶date類的使用 from datetime import date dateObj = date(2019, 10, 10) print(dateObj) print(date.today()) """ class Date(object): def __init__(self, year, month, day): self.year = year self.month = month self.day = day def __str__(self): return "%s-%s-%d" % (self.year, self.month, self.day) @classmethod def today(cls): """ 返回當前的日期對象 cls: 類名稱Date :return: Date實例化的對象名稱 """ #獲取當前的時間, 返回的是命名元組的格式 #time.struct_time(tm_year=2019, tm_mon=12, tm_mday=29, tm_hour=16, tm_min=49, tm_sec=32, tm_wday=6, tm_yday=363, tm_isdst=0) now = time.localtime() return cls(now.tm_year, now.tm_mon, now.tm_mday) def is_leap(self): """ 判斷是否爲閏年? 一個閏年就是能被4整除可是不能被100整除 或者 year能被400整除. :return: """ return (self.year % 4 == 0 and self.year % 100 != 0) or (self.year % 400 == 0) if __name__ == '__main__': # 獲取當前日期, today是當前日期對象。 today = Date.today() #打印日期對象, 返回字符串'2019-12-29', 由於有__str__魔術方法。 print(today) #判斷是否爲閏年? print("今年是否爲閏年? ", today.is_leap()) #dateObj = Date(2019, 10, 10) #print(dateObj)
property類屬性
什麼是property屬性?
一種用起來像是使用的實例屬性同樣的特殊屬性,能夠對應於類的某個方法。
property屬性的定義和調用要注意一下幾點:code
from datetime import date class Date(object): def __init__(self, year, month, day): self.__year = year self.__month = month self.__day = day #功能一: 將類方法轉換成類屬性 #應用場景: 某個屬性只能訪問不能修改時使用。 @property def year(self): return self.__year @property def month(self): return self.__month @property def day(self): return self.__day def __str__(self): return "%s-%s-%d" % (self.__year, self.__month, self.__day) if __name__ == '__main__': dateObj = Date(2019, 12, 12) print(dateObj.day) """ # 08_property類屬性.py from datetime import date class Date(object): def __init__(self, year, month, day): self.__year = year self.__month = month self.__day = day #功能一: 將類方法轉換成類屬性 #應用場景: 某個屬性只能訪問不能修改時使用。 @property def year(self): return self.__year @property def month(self): return self.__month @property def day(self): return self.__day def __str__(self): return "%s-%s-%d" % (self.__year, self.__month, self.__day) if __name__ == '__main__': dateObj = Date(2019, 12, 12) print(dateObj.day)