強化訓練:第四篇
問題來源
面向對象的語言的重要特性是存在類的概念
內容
- 新式類和舊式類
- 定義類的屬性和“訪問權限”
- 類的方法
- 繼承:代碼復用
- 特殊方法定制類
1.
新式和舊式類:python2中存在差異,python3中無差異
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.
類的屬性和“訪問權限”
本質上python語言并沒有訪問限制。
訪問權限通過遵循一定的屬性和方法命名規約達到這個效果。
_name
:約定單下劃線是該類的內部實現
__name
:雙下劃線會使得訪問名稱變為:_classname__name
class NewStyle(object):
name = "NewStyle" # 所有類的對象訪問
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__) # 獲取構造函數中的屬性
print(one.get_age())
print(one.get_grade())
#{'_age': 24, 'email': 'xie_wei_sh@foxmail.com', #'_NewStyle__grade': 9}
#24
#9
3.
類的方法
- 函數是代碼塊,直接調用
- 方法從屬于類
- 裝飾器@classmethod # 以類名的方式訪問
- 裝飾器@property # 以屬性的方式訪問
class NewStyle(object):
name = "NewStyle" # 所有類的對象訪問
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__) # 獲取構造函數中的屬性
print(NewStyle.get_age())
print(one.get_grade)
4.
繼承:代碼復用
- 調用屬性和方法
- super()調用父類方法
- 類名調用父類方法
- 子類的類型判斷: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.
特殊方法定制類
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): # 實例化顯示一個有意義的輸出
return ('{0}::->>>{1}::->>>{2}'.format(self.name, self.email, self.age))
__repr__ = __str__
def __add__(self, other): # 實現類的加法
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): # 實現類的乘法
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.
類, 實例及其他對象的內建函數
- 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__) # 類文檔
print(vars(magicmethod)) # 類的屬性及其值
print(magicmethod.__dict__) # 類的屬性及其值
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") # 設置屬性值
print(vars(magicmethod))
delattr(magicmethod, "name") # 刪除屬性name及其值
print(vars(magicmethod))
參考:[python cookbook]