1.類中的方法
- 1)對象方法
怎么聲明:直接聲明在類中的函數(shù)
怎么調用:通過對象來調用
特點:有個指向當前對象的默認參數(shù)self巾钉;調用的時候不需要傳參
什么時候用:實現(xiàn)函數(shù)的功能需要用對象屬性 - 2)類方法
怎么聲明:聲明函數(shù)前 '@classmethod'
怎么調用:通過類來調用翘狱,'類.方法名'
特點:有個默認參數(shù)cls,這個參數(shù)在通過類調用的時候不需要傳參砰苍;指向當前類(誰調用指向誰)
類能做的事潦匈,cls都可以做
什么時候用:實現(xiàn)函數(shù)的功能不需要對象屬性的前提下,需要類的字段(需要類)师骗,這個就用類方法 - 3)靜態(tài)方法
怎么聲明:聲明函數(shù)前加 '@staticmethod'
怎么調用:通過類來調用历等,'類.方法名()'
特點:無特點(沒有默認參數(shù))
什么時候用:實現(xiàn)函數(shù)的功能既不需要對象屬性也不需要類的字段,此時使用靜態(tài)方法
class Student:
num = 23
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel
self.stu_id = '001'
def study(self):
print('%s在學習' % self.name)
# 類方法
@classmethod
def count(cls):
pass
stu2 = cls('dd', 12, 42223)
print(stu2)
cls.func()
@classmethod
def func(cls):
pass
@staticmethod
def static_func():
print('靜態(tài)方法')
stu1 = Student('ss', 18, 2222)
# 對象方法調用
stu1.study()
# 類方法調用
Student.count()
# 靜態(tài)方法調用
Student.static_func()
1.訪問權限
公開(public):屬性和方法在類的內部可以使用辟癌、可以被繼承也可以在類的外部使用
保護(protect):屬性和方法在類的內部可以使用、可以被繼承荐捻;不能在類的外部使用
私有(private):屬性和方法在類的內部可以使用黍少、不可以被繼承,也不能在類的外部使用
python中本質上所有的屬性和方法都是公開的处面,私有化是假的私有化
- 2.私有化
語法:在聲明屬性或者方法的時候厂置,在屬性名前或者方法名前加'';
注意:只能''開頭,不能以'__'結尾
私有化的原理:只是單純在私有屬性或者方法名前加'_類名',導致直接使用原名使用不了屬性和方法
class Person:
num = 22
__num1 = 24
def __init__(self, name, age=0, gender='男'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food: str):
print('%s在吃%s' % (self.name, food))
@classmethod
def show_num(cls):
print(cls.num, cls.__num1)
p1 = Person('豬皮', 22)
Person.show_num()
print(Person.num)
# print(Person._Person__num1)
1.什么時候使用getter和setter
1)getter - 希望獲取一個屬性值之前做別的事情魂角,就給這個屬性添加getter
2)setter - 希望給屬性賦值之前做點別的事情昵济,就給這個屬性添加setter
- 2.怎么給屬性添加getter和setter
1)怎么添加getter
在需要添加getter的屬性前加_
在@property后面聲明一個函數(shù),函數(shù)名和去掉的屬性名一致,并且函數(shù)需要一個返回值表示獲取屬性的值
在外面通過不帶下劃線的屬性名去獲取對應的屬性值
2)怎么添加setter:
如果想要給屬性添加setter必須先給它添加getter
@getter名.setter后面聲明函數(shù);函數(shù)名和去掉的屬性名一致访忿,這個函數(shù)不需要返回值瞧栗,但是需要一個參數(shù)
在外面通過不帶下劃線的屬性名去給對應的屬性賦值
class ReadError(Exception):
def __str__(self):
print('該數(shù)據(jù)只讀')
class Rect:
def __init__(self, width, length):
self.width = width
self.length = length
self._area = 0
self._perimeter = 0
self._age = 0
@property
def area(self):
return self.width*self.length
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if type(value) != int:
print('數(shù)據(jù)有誤,數(shù)據(jù)類型錯誤')
if 0 < value <= 200:
self._age = value
else:
print('數(shù)據(jù)有誤')
raise ValueError
@area.setter
def area(self, value):
raise ReadError
@property
def perimeter(self):
return 2*(self.length + self.width)
@perimeter.setter
def perimeter(self, value):
raise ReadError
r1 = Rect(10, 20)
r1.age = 28
print(r1.age)
print(r1.area)