.類方法和靜態(tài)方法
類中方法:對象方法、類方法和靜態(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 Math:
pi = 3.1415926
@classmethod
def circle_area(cls, radius):
return cls.pi * radius ** 2
@staticmethod
def sum(num, num1):
return num + num1
print(Math.circle_area(6))
print(Math.sum(4, 3))
class Person:
num = 61
@classmethod
def destory(cls):
# cls指向的是當(dāng)前類,調(diào)用這個方法的類可以做的事情,cls都可以做
print('cls:', cls, cls.num)
print('人類破壞環(huán)境')
# 聲明一個靜態(tài)方法
@staticmethod
def func1():
print('人類的靜態(tài)方法')
print(Person)
print(Person.num)
p1 = Person()
p1.destory()
運(yùn)行結(jié)果
113.0973336
7
<class '__main__.Person'>
61
cls: <class '__main__.Person'> 61
人類破壞環(huán)境
2.私有化
類中的內(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 __func1(self):
print('對象方法私有')
p1 = Person('小明', 23)
print(p1.name)
print(p1.__dict__)
# print(p1._Person__age)
# p1.__func1()
運(yùn)行結(jié)果
小明
{'name': '小明', '_Person__age': 23}
3.getter和setter
1.什么時候需要添加對象屬性的getter和setter
如果希望通過對象.屬性獲取屬性的值之前,在干點兒別的事情,就可以給這個屬性添加getter
如果希望通過對象.屬性給屬性賦值之前,在干點別的事,就可以給這個屬性添加setter
2.怎么添加setter和getter
getter:
a.在屬性名加一個下劃線
b.添加屬性對應(yīng)的getter
@property
def 屬性名去掉_(self):
函數(shù)體 ---> 會對屬性的值進(jìn)行處理后返回相應(yīng)的結(jié)果(必須要要一個返回值)
c.使用屬性的值的時候,不通過帶下劃線的屬性名去使用,而是通過沒有下劃線的屬性去使用
注意:對象.不帶下劃線的屬性名 --> 實質(zhì)調(diào)用getter對應(yīng)的函數(shù)
setter:
如果想要添加setter必須要先添加getter
a.添加setter
@getter名.setter
def 屬性名去掉_(self, 參數(shù))
做別的事情
self.屬性名 = 處理后的值
代碼示例
class Number:
def __init__(self, week):
self._value = 0
self._week = week
self.type = int
self.id = None
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if not -100 <= value <= 100:
raise ValueError
self._value = value
@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ù)和不是0~6會報錯
if not isinstance(value, int):
raise ValueError
if not 0 <= value <= 6:
raise ValueError
self._week = value
number = Number(5)
print(number.week)
print(number._week) # 實質(zhì)是通過number調(diào)用getter對應(yīng)的對象方法week
number.week = 6 # 實質(zhì)是通過number調(diào)用setter對應(yīng)的對象方法week
print(number.__dict__)
number.value = 58
print(number.value)
運(yùn)行結(jié)果
星期五
5
{'_value': 0, '_week': 6, 'type': <class 'int'>, 'id': None}
58
練習(xí):要求年齡的值只能是0-100,超過報錯,獲取age,返回年齡值以及其相應(yīng)階段
代碼如下
class Person:
def __init__(self, name, age=18):
self.name = name
self._age = age
@property
def age(self):
if 1 <= self._age <= 3:
return self._age, '幼兒階段'
elif 3 < self._age <= 12:
return self._age, '兒童階段'
elif 13 < self._age <= 18:
return self._age, '青少年階段'
elif 18 < self._age <= 30:
return self._age, '青年階段'
elif 30 < self._age <= 50:
return self._age, '中年階段'
elif 50 < self._age <= 100:
return self._age, '老年階段'
@age.setter
def age(self, age):
if not 0 <= age <=100:
raise ValueError
self._age = age
person = Person('小明')
print(person.age)
person.age = 70
print(person.age)
運(yùn)行如下
(18, '青少年階段')
(70, '老年階段')