強(qiáng)化訓(xùn)練:第四篇
問(wèn)題來(lái)源
面向?qū)ο蟮恼Z(yǔ)言的重要特性是存在類(lèi)的概念
內(nèi)容
- 新式類(lèi)和舊式類(lèi)
- 定義類(lèi)的屬性和“訪(fǎng)問(wèn)權(quán)限”
- 類(lèi)的方法
- 繼承:代碼復(fù)用
- 特殊方法定制類(lèi)
1.
新式和舊式類(lèi):python2中存在差異,python3中無(wú)差異
class OldStyle:
name = "OldStyle"
class NewStyle(object):
name = "NewStyle"
print(type(OldStyle))
print(dir(OldStyle))
print((OldStyle.name))
print(type(NewStyle))
print(dir(NewStyle))
print(NewStyle.name)
2.
類(lèi)的屬性和“訪(fǎng)問(wèn)權(quán)限”
本質(zhì)上python語(yǔ)言并沒(méi)有訪(fǎng)問(wèn)限制。
訪(fǎng)問(wèn)權(quán)限通過(guò)遵循一定的屬性和方法命名規(guī)約達(dá)到這個(gè)效果。
_name
:約定單下劃線(xiàn)是該類(lèi)的內(nèi)部實(shí)現(xiàn)
__name
:雙下劃線(xiàn)會(huì)使得訪(fǎng)問(wèn)名稱(chēng)變?yōu)椋?code>_classname__name
class NewStyle(object):
name = "NewStyle" # 所有類(lèi)的對(duì)象訪(fǎng)問(wèn)
def __init__(self, email, age, grade):
self.email = email
self._age = age
self.__grade = grade
def get_age(self):
return self._age
def get_grade(self):
return self.__grade
one = NewStyle("xie_wei_sh@foxmail.com", 24, 9)
print(one.__dict__) # 獲取構(gòu)造函數(shù)中的屬性
print(one.get_age())
print(one.get_grade())
#{'_age': 24, 'email': 'xie_wei_sh@foxmail.com', #'_NewStyle__grade': 9}
#24
#9
3.
類(lèi)的方法
- 函數(shù)是代碼塊,直接調(diào)用
- 方法從屬于類(lèi)
- 裝飾器@classmethod # 以類(lèi)名的方式訪(fǎng)問(wèn)
- 裝飾器@property # 以屬性的方式訪(fǎng)問(wèn)
class NewStyle(object):
name = "NewStyle" # 所有類(lèi)的對(duì)象訪(fǎng)問(wèn)
def __init__(self, email, age, grade):
self.email = email
self._age = age
self.__grade = grade
@classmethod
def get_age(cls):
return cls.name
@property
def get_grade(self):
return self.__grade
one = NewStyle("xie_wei_sh@foxmail.com", 24, 9)
print(one.__dict__) # 獲取構(gòu)造函數(shù)中的屬性
print(NewStyle.get_age())
print(one.get_grade)
4.
繼承:代碼復(fù)用
- 調(diào)用屬性和方法
- super()調(diào)用父類(lèi)方法
- 類(lèi)名調(diào)用父類(lèi)方法
- 子類(lèi)的類(lèi)型判斷:isinstance, issubclass
- 多繼承:
class A(object):
def __init__(self, name, age):
self._name = name
self.__age = age
class B(A):
def __init__(self, name, age, email):
super(B, self).__init__(name, age)
self.__email = email
new_b = B("xiewei", 24, "xie_wei_sh@foxmail.com")
print(new_b.__dict__)
print(issubclass(B, A))
#{'_A__age': 24, '_B__email': 'xie_wei_sh@foxmail.com', #'_name': 'xiewei'}
#True
5.
特殊方法定制類(lèi)
class Main(object):
"""
Learn python :
"""
name = "Main"
def __init__(self, name, email, age=24):
self.name = name
self.age = age
self.email = email
def __str__(self): # 實(shí)例化顯示一個(gè)有意義的輸出
return ('{0}::->>>{1}::->>>{2}'.format(self.name, self.email, self.age))
__repr__ = __str__
def __add__(self, other): # 實(shí)現(xiàn)類(lèi)的加法
return self.__class__(self.name +" 1 " + other.name, self.email + " 2 " + other.email, self.age +other.age)
def __iadd__(self, other):
self.name += other.name
self.email += other.email
self.age += other.age
return self
def __mul__(self, num): # 實(shí)現(xiàn)類(lèi)的乘法
if isinstance(num, int):
return self.__class__(self.age *num, self.email *num, self.name *num)
main1 = Main('xiewei', email="xie_wei_sh@foxmail.com")
main2 = Main("weixie", "wuxiaoshen@shu.edu.cn", 32)
print(main1)
print(main2)
main1 += main2
print(main1)
print(main1*2)
#xiewei::->>>xie_wei_sh@foxmail.com::->>>24
#weixie::->>>wuxiaoshen@shu.edu.cn::->>>32
#xieweiweixie::->>>xie_wei_sh@foxmail.comwuxiaoshen@shu.edu.cn::->>>56
#112::->>>xie_wei_sh@foxmail.comwuxiaoshen@shu.edu.cnxie_wei_sh@foxmail.comwuxiaoshen@shu.edu.cn::->>>xieweiweixiexieweiweixie
6.
類(lèi), 實(shí)例及其他對(duì)象的內(nèi)建函數(shù)
- hasattr()
- getattr()
- setattr()
- delattr()
- vars()
obj.__dict__
class MagicMethod(object):
"""how can i become strong."""
name = "MagicMethod"
def __init__(self, name, email):
self.name = name
self.email = email
# def __doc__(self):
# return "This is test."
magicmethod = MagicMethod("xiewei", "xie_wei_sh@foxmail.com")
print(magicmethod.__doc__) # 類(lèi)文檔
print(vars(magicmethod)) # 類(lèi)的屬性及其值
print(magicmethod.__dict__) # 類(lèi)的屬性及其值
print(hasattr(magicmethod, 'name')) # 判斷是否有屬性值 name
print(hasattr(magicmethod, "email")) # 判斷是否有屬性值 email
print(getattr(magicmethod, "name")) # 獲取屬性name的值
print(getattr(magicmethod, "email")) # 獲取屬性email的值
setattr(magicmethod, "email", "xie_wei_sh@foxmail.com_copy") # 設(shè)置屬性值
print(vars(magicmethod))
delattr(magicmethod, "name") # 刪除屬性name及其值
print(vars(magicmethod))
參考:[python cookbook]