"""author = 陳俊龍"""
============類方法和靜態(tài)方法===========
1.類中的方法:
1)對象方法
a.怎么聲明:直接聲明在類中的函數(shù)
b.怎么調(diào)用:通過對象來調(diào)用
c.特點(diǎn):有個指向當(dāng)前對象的默認(rèn)參數(shù)self撬即,調(diào)用的時候不需要傳參
d.什么時候用:實(shí)現(xiàn)函數(shù)的功能需要用到對象屬性的時候
2)類方法
a.怎么聲明:在聲明函數(shù)前加 @classmethod
b.怎么調(diào)用:通過類來調(diào)用 通過 !類.方法名()唱歧!
c.特點(diǎn):有個默認(rèn)參數(shù)cls粒竖,通過類調(diào)用時不需要傳參,指向的是當(dāng)前調(diào)用它的類沿后, 類能做的事情朽砰,cls都能做
d.什么時候用:屬性函數(shù)的功能,首先在不需要對象屬性的前題下漆弄,需要類的字段(需要類)的時候
3)靜態(tài)方法
a.怎么聲明:在聲明函數(shù)前加@staticmethod
b.怎么調(diào)用:通過 造锅!類.方法名()哥蔚! 來調(diào)用
c.特點(diǎn):沒有默認(rèn)參數(shù)
d.什么時候用:實(shí)現(xiàn)函數(shù)功能既不需要對象屬性,也不需要類的字段的時候
class Student:
num = 30
def __init__(self, name, age, tel, study_id):
self.name = name
self.age = age
self.tel = tel
self.study_id = study_id
# 對象方法:
def study(self):
print('%s在學(xué)習(xí)' % self.name)
# 類方法:
@classmethod
def count(cls):
print('類方法1')
stu = cls('小花', 12, '123', 222)
print(stu)
# 靜態(tài)方法:
@staticmethod
def sta_func():
print('靜態(tài)方法')
Student.count() # 類方法1
Student.sta_func() # 靜態(tài)方法
================私有化=================
1.訪問權(quán)限:
公開(public):
屬性和方法在類的內(nèi)部可以使用渤愁,可以被繼承深夯,也可以在類的外部使用
保護(hù)(protect):
屬性和方法在類的內(nèi)部可以使用,可以被繼承他挎,不可以在類的外部使用
私有(private):
屬性和方法在類的內(nèi)部可以使用办桨,不可以被繼承站辉,不可以在類的外部使用
注意:python本質(zhì)上所以的屬性和方法都是公開的,私有化是殊霞!假的私有化汰蓉!
原理:只是單純的在私有屬性或方法前加 類名,導(dǎo)致直接使用原名使用不了祝钢,所以通過在最前面加一個下劃線類名其實(shí)也可以訪問
2.私有化:
語法:在聲明屬性或方法的時候若厚,在屬性名或方法名!前!加兩個下劃線_ _
class Person:
num = 80
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def __eat(self, food):
print('%s在吃%s' % (self.name, food))
@classmethod
def show_num(cls):
print('人類的數(shù)量是:%s' % cls.num)
p1 = Person('小明', 12, '男')
print(Person.num)
Person.show_num()
print(Person.__dict__)
# 通過_類名__對象方法還是可以訪問
p1._Person__eat('面包')
==============getter和setter=============
1.什么時候使用getter和setter:
1)getter: - 希望在獲取一個屬性的值之前做一點(diǎn)別的事情
2)setter: - 希望在給屬性的值賦新值之前做一點(diǎn)別的事情
2.如何添加getter和setter:
1)如何添加getter
a.在需要添加的屬性前加一個下劃線_
b.@property后面聲明一個函數(shù)测秸,函數(shù)名和不帶下劃線_的屬性名一致,并且函數(shù)需要一個返回值表示獲取屬性的值
c.在外面通過不帶下劃線的 對象.屬性名 去獲取對應(yīng)的值
2)如何添加setter:
a.如果想要給屬性添加setter必須先給他添加getter
b.@getter名.steter后面聲明函數(shù)霎冯,函數(shù)名和去掉下劃線的屬性名一致,這個函數(shù)不需要返回值锚贱,但需要一個參數(shù)
添加getter和setter的實(shí)例:
class Person:
num = 80
def __init__(self, name, age, gender):
self.name = name
self._age = age
self._gender = gender
def __eat(self, food):
print('%s在吃%s' % (self.name, food))
# 添加getter
@property
def gender(self):
if self._gender == 1:
return '男'
else:
return '女'
@property
def age(self):
return self._age
# 添加setter
@age.setter
def age(self, value):
if type(value) != int:
print('數(shù)據(jù)有誤')
if 0 < value <= 200:
self._age = value # 注意這里如何真正的賦值
else:
print('年齡超范圍')
p1 = Person('小明', 18, 1)
p1.age = 100
print(p1.gender)
print(p1.age)
class Rect:
def __init__(self, width, length):
self.width = width
self.length = length
self._area = 0
self._perimeter = 0
# 添加getter
@property
def area(self):
return self.length*self.width
@property
def perimeter(self):
return (self.width+self.length)*2
@perimeter.setter
def perimeter(self, value): # 注意這里還是要給一個變量來接收拧廊,但可以不操作
print(value)
print('該屬性是只讀的')
r1 = Rect(4, 6)
# r1.area = 10 # AttributeError: can't set attribute 只添加getter而不添加setter將無法給這個值賦值
print(r1.area)
print(r1.perimeter)
r1.perimeter = 100 # 該屬性是只讀的 (賦值的時候晋修,其實(shí)是在調(diào)用剛才自己寫的那個函數(shù))
====================繼承===============
1.什么是繼承:
讓子類直接擁有父類的屬性和方法
2.怎么繼承:
注意:python中所以的類,默認(rèn)都是繼承自object這個基類
語法:
class 類名(父類1倦春,父類2,.....)
類的內(nèi)容
繼承發(fā)生后尿庐,子類直接擁有了父類所以的屬性和方法 D匮摺!唯一的例外是slots魔法皮假,只會約束當(dāng)前類骂维,不會影響子類
3.子類添加內(nèi)容:
1)添加字段和方法:
直接在子類中添加新的字段或方法
2)添加對象屬性:
在子類的init函數(shù)中加入 super()._ init _() 航闺,就可以做到繼承父類的對象屬性,同時子類的屬性還是有汰扭,
關(guān)鍵是前面的 super().函數(shù)名() 這個東西 這個公式是通用的福铅,!但對靜態(tài)方法無效笆包!
如果在創(chuàng)建子類對象的時候略荡,父類還需要傳入?yún)?shù)時,可以在 super.函數(shù)名 (父類的參數(shù))的括號里面?zhèn)鬟f這些父類需要的參數(shù)
巴粪!想到如果你想在子類創(chuàng)建時一起把父類的參數(shù)也輸入應(yīng)該怎么做粥谬!
類中的函數(shù)的調(diào)用順序:
是先看當(dāng)前類中有沒有這個方法漏策,如果沒有,就往上找父類芭届,如果再沒有,又繼續(xù)往上找褂乍,以此類推逃片,直到找到基類
如果基類都沒有才會報錯
class Person:
num = 61
def __init__(self, name='張三', age=0, gender='男'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food):
print('%s在吃%s' % (self.name, food))
class Student(Person):
pre = 'stu'
def __init__(self):
# 在這里調(diào)用父類的init方法
super().__init__()
self.study_id = '001'
self.score = 0
def study(self):
print('%s正在學(xué)習(xí)' % self.name)
1.子類可以繼承父類的屬性和方法實(shí)例
stu1 = Student()
stu1.eat('面包')
print(stu1.name)
2.子類可以使用父類的內(nèi)容题诵,但父類不能使用子類的
stu1.study()