recode
1,class 類名(父類):
類的內(nèi)容
2.對象:類的實例(具體)
對象 = 類名()
3.構(gòu)造方法和init方法
構(gòu)造方法:聲明類的時候,系統(tǒng)會自己創(chuàng)建一個函數(shù),這個函數(shù)和類名一樣。這個方法就是構(gòu)造方法。
構(gòu)造的作用就是創(chuàng)建對象,并且自動調(diào)用構(gòu)造方法 init方法 :系統(tǒng)在創(chuàng)建對象的時候自動調(diào)用。
可以有除了self、以外的其它參數(shù)
需要給類添加對象屬性的時候
class Person:
num = 1
def __init__(self,name,age):
print(self)
print('aaaaa')
def func1(name,age):
print(name,age.sex)
def func2(*args,**kwargs):
對象方法:直接聲明在類中的函數(shù)就是對象方法,有默認(rèn)參數(shù)self,并且要通過參數(shù)的小紅
對象的屬性:聲明在init方法中
self.屬性 = 值
類的字段(類的屬性):只能聲明變量或者聲明函數(shù)
聲明在類中,在函數(shù)的外面的變量;通過類來使用(不管在哪用)
dict
class Person:
num = 61
__slots__ = ('name','age','sex')
def __init__(self,name,age = 10,sex = 'boy'):
self.name = name
self.age = age
self.sex = sex
p1 = Person('老余')
p2 = Person('老張',18)
p3 = Person('老龍',22,'爺們')
類中方法:對象方法、類方法和靜態(tài)方法
對象方法:
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)方法都可以
靜態(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:
π = 3.1415926
@classmethod
def circle_ared(cls,radius):
return cls.π * radius ** 2
@staticmethod
def sum(num1, num2):
return num1 + num2
class Rect:
def __init__(self,lenth,whdtu):
self.lenth = lenth
self.whdtu = whdtu
def area(self):
return self.lenth*self.width
class Person:
num = 61
# 聲明一個類方法
@classmethod
def destroy(cls):
# cls 只想的是當(dāng)前類。調(diào)用這個方法的類可以做的。cls都能做
print('cls',cls,cls.num)
p2 = cls()
print('人類破壞環(huán)境')
#聲明一個靜態(tài)方法
@staticmethod
def func1():
print(Person.num)
p3 = Person()
print(p3)
print('人類的靜態(tài)方法')
class Student(Person):
pass
(大家都是成年人,都是靠自覺)
類中的內(nèi)容默認(rèn)是公開的(在類的外面可以使用)
1、私有化:
將類的內(nèi)容在類的外部隱藏
在類中方法名或者屬性名前加倆下劃線
私有的方法和屬性只能在類的內(nèi)部使用,不能在類的外部使用
私有的原理
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('阿曾', 22)
print(p1.name)
p1.show_info()
print(p1.__dict__)
print(p1._Person__age)
1.什么時候需要添加對象屬性的getter和setter
如果希望在通過對象.屬性獲取屬性的值之前,在干點別的事情,就可以給這個屬性添加getter
如果希望在通過對象.屬性給屬性賦值之前,在干點別的事兒,就可以這個屬性添加setter
2.怎么添加setter 和 gett
getter:
屬性名前+_ 加一個下劃線,
b,添加屬性對應(yīng)的grtter
@property
def 屬性名去掉_(self):
函數(shù)體--》會對屬性的值進(jìn)行處理后返回相應(yīng)的結(jié)果(必須要有返回值)
c.使用屬性的值的時候,不通過帶下劃線的屬性名,而是通過沒有下劃線的屬性去使用
注意:對象。不帶下劃線的屬性 --》調(diào)用getter對應(yīng)的函數(shù)
setter
如果想要添加setter 必須先添加 getter
@getter名。sett
def 屬性名去掉_(self,參數(shù)):
做別的事情
self.屬性名= 處理后的值
# class Person:
# def __init__(self):
# self.name
# self.age
#賦值時要求age的值只能在0~150之間超過范圍報錯:獲取age的值的時候,返回年齡值。
# 并且返回這個年齡對應(yīng)的階段
# print(p1.age)
class Number:
def __init__(self):
self._value = 0
self._week = 3
self.type = int
self.id = None
# _value添加gett和setter
@property
def value(self):
return self._value
@value.setter
def value(self,x):
if not -100 <= x <= 100:
raise ValueError
self._value = x
@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 '星期六'
# inisstance(值,類)--》判斷指定的值是否是指定類型
@week.setter
def week(self,value):
if not isinstance(value,int):
raise ValueError
if not 0 <= value <= 6:
raise ValueError
self._week = value
number = Number()
number.value = 3
print(number.week)# number .week 實質(zhì)是通過number調(diào)用對象方法week
number.week = 1 # 通過number.week = 值 實質(zhì)是通過number去掉用setter對應(yīng)的week的方法
number.value = 5
print(number.value)