02-類方法和靜態(tài)方法
類中方法有三種:對象方法嘿棘,類方法骇笔,靜態(tài)方法
1.對象方法
聲明在類中
有默認參數(shù)self
通過對象調(diào)用:對象.對象方法
2.類方法
在聲明前加一個@classmethod
有默認參數(shù)cls,調(diào)用時不需要給cls傳參,系統(tǒng)會自動將調(diào)用類方法的類傳給cls驳概。
cls最終就是這個類宰衙,類可以做的事cls都可以做
通過類去調(diào)用:類.類方法()
3.靜態(tài)方法
聲明前@staticmethod
沒有默認參數(shù)
通過類調(diào)用:類.靜態(tài)方法
4.對三種方法的選擇
什么時候使用對象方法:
當實現(xiàn)函數(shù)功能需要使用對象屬性是就用對象方法
什么時候使用類方法:
實現(xiàn)函數(shù)功能不需要使用對象屬性,但是需要類的時候就使用類方法
什么時候使用靜態(tài)方法:
實現(xiàn)函數(shù)功能不需要使用對象屬性也不需要類的時候就使用靜態(tài)方法
class Person:
def __init__(self,name):
self.name = name
def eat(self,food):
print('%schhi%s'% self.name,food)
類方法
@classmethod
def destroy(cls):
print(1)
靜態(tài)方法
@staticmethod
def hit_animal():
print('ren')
Person.destroy()
Person.hit_animal()
聲明一個數(shù)學類募强,屬性:pi 功能:求圓的面積,qiu 和
class Math:
pi = math.pi
@classmethod
def area(cls,r):
print(cls.pi*(r**2))
@staticmethod
def sum1(num1,num2):
return num1+num2
Math.area(1)
print(Math.sum1(1,5))
03-私有化
1.私有化指的是
在類中可以通過在屬性名前或者方法名前加(注意:結(jié)尾不能加),那么這個屬性或者方法就會變成私有的。
私有的屬性和方法在類的外部不能使用
class Peerson:
__num = 100#私有屬性
def __init__(self):
self.name = 45
def show(self):
print('名字',self.name)
2.私有化原理
Python中并沒有真正的私有化崇摄,不能從訪問權(quán)限上控制使用
只是在以_開頭的名字前加‘類名’擎值,導致不能通過原名訪問
04-對象屬性的getter和setter
如果希望在獲取對象屬性之前要做點別的事情,就給這個屬性添加getter
如果希望在給對象屬性賦值之前要做點別的事情配猫,就給這個屬性添加setter
2.給屬性添加getter
屬性命名的時候,屬性名前加_ ; self._age = 0
聲明一個函數(shù)杏死,函數(shù)名是屬性名(不要下劃線)泵肄,不需要參數(shù),要一個返回值淑翼,并且使用@property修飾腐巢。
這個函數(shù)的返回值就是獲取屬性的結(jié)果@property
def age(self):
return 年齡相關值
當需要獲取屬性的時候通過對象.不帶下劃線的屬性;如 :對象.age
3.給對象屬性添加setter
想要給對象屬性添加setter玄括,必須先給它添加getter
屬性命名的時候冯丙,屬性名前加_ ; self._age = 0
聲明一個函數(shù),函數(shù)名是屬性名(不要下劃線)遭京,需要一個額外參數(shù)胃惜;
使用函數(shù)前用@getter名.setter修飾
@age.setter
def age(self,value):
self._age = value
class Person:
def __init__(self,name='li'):
self.name = name
self._age = 0
self.set = 'nan'
# 這兒的age屬性就是屬性_age的getter方法
@property
def age(self):
if self._age < 1:
return 'yiner'
elif self._age < 18:
return 'weichengnian'
else:
return 'chengnianren'
@age.setter
def age(self,value):
if not isinstance(value,int):
print('整數(shù)')
if not (0<=value<=100):
print('錯')
self._age = value
p1 = Person()
# 這兒實質(zhì)是在調(diào)用_age的getter方法
print(p1.age)
# 這兒實質(zhì)是在調(diào)用_age的getter方法:p1.age(23)
p1.age = 23
class Time:
def __init__(self):
self._miao = 0
@property
def miao(self):
return self._miao
@miao.setter
def miao(self,time):
if int(time[0:2]) > 60 or int(time[-2:]) > 60:
print('錯誤')
else:
t1 = int(time[0:2])*60 + int(time[-2:])
self._miao = t1
# 打印自己聲明的類的對象的時候,默認打印的是:<模塊名.類名 object at 對象地址>
# 如果不希望這樣哪雕,可以使用__repr__方法船殉,打印對象的時候就會打印這個方法的返回值
返回值必須是字符串
def __repr__(self):
return str(self.miao)
t1 = Time()
t1.miao = ('02:23')
print(t1.miao)
class Person:
def __init__(self,name='li'):
self.name = name
self._age = 0
self.set = 'nan'
def __repr__(self):
return str(self.__dict__)[1:-1]
p1 = Person()
print(p1)
05-類的繼承
1.繼承
python中的類支持繼承,并且支持多繼承
默認情況下是繼承自object(object就是Python中類的基類)
什么是繼承:
一個類可以繼承另外一個類斯嚎,繼承者叫子類利虫,被繼承者叫父類挨厚。繼承就是讓子類直接擁有父類中的內(nèi)容
可以繼承哪些內(nèi)容
所有屬性和方法都可以繼承
slots對應的值不會被繼承
class Person:
num1 = 100
def __init__(self):
self.name = '張三'
self._age = 0
self.sex = 'nan'
def c(self):
return 12
# Stu類繼承Person類
class Stu(Person):
pass
# 學生對象
stu1 = Stu()
# 對象屬性,字段,對象方法都可以繼承
print(stu1.name,stu1.num1,stu1.c())
06-添加屬性和方法
子類除了有父類的屬性和方法外疫剃,還有自己的屬性和方法
1.在子類中添加方法
添加新的方法
直接在子類中聲明其他方法;添加后子類可以用自己和父類的方法,但是父類不能用子類的方法
重寫父類的方法:重新實現(xiàn)父類的方法
完全重寫 - 覆蓋父類的功能- 重新實現(xiàn)父類方法
部分重寫硼讽,保留父類功能巢价,添加新的功能 - 在子類中實現(xiàn)父類方法的時候通過super調(diào)用父類方法,
再添加新的方法
注意:可以在子類的方法中理郑,可以通過super調(diào)用父類的任何方法
super(類蹄溉,對象)- 獲取對象中父類的部分(要求對象是指定的類的對象)
類中方法的調(diào)用過程
通過類或者對象調(diào)用方法的時候,先看當前類中是否聲明過這個方法您炉,如果有就直接調(diào)用柒爵,
如果沒有就去找父類,如果父類中也沒有赚爵,再往上找棉胀,直到找到object,如果object中也沒有冀膝,就會報錯
注意:靜態(tài)方法中不能使用super()
class Person:
num1 = 100
def __init__(self):
self.name = '張三'
self._age = 0
self.sex = 'nan'
def show_message(self):
print(self.name,'你好啊')
class Students(Person):
def study(self):
print('xuexi')
# 保留父類功能唁奢,
def show_message(self):
super().show_message()
print('我要去學校')
1.添加字段
直接添加新的字段
2.添加對象屬性
類的對象屬性是繼承父類的init方法繼承下來的
如果想要保留父類的屬性并添加新的屬性,
需要在子類的init方法中通過super()去調(diào)用父類的init方法
class Person:
num1 = 100
def __init__(self):
self.name = '張三'
self.age = 0
self.sex = 'nan'
class Stu(Person):
number = 152
def __init__(self):
super().__init__()
self.stu_id = '101'
stu1 = Stu()
print(stu1.name)
動物類窝剖。屬性:年齡麻掸,顏色,類型赐纱,創(chuàng)建對象的時候類型和顏色必須賦值
貓類脊奋,屬性:年齡,顏色疙描,類型诚隙,愛好,創(chuàng)建對象時顏色必須賦值起胰,類型不能賦值
class Animal:
def __init__(self,color,type,age=0):
self.color = color
self.type = type
self.age = age
class Cat(Animal):
def __init__(self,color,hobby='',age=0):#數(shù)量=父類屬性數(shù)量+自己屬性
super().__init__(color,'cat',age)
# self.type = 'cat'
self.hobby = hobby
c1 = Cat(5)