Python 強化訓練:第四篇

強化訓練:第四篇

問題來源

面向對象的語言的重要特性是存在類的概念

內容

  1. 新式類和舊式類
  2. 定義類的屬性和“訪問權限”
  3. 類的方法
  4. 繼承:代碼復用
  5. 特殊方法定制類

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.

類的方法

  1. 函數是代碼塊,直接調用
  2. 方法從屬于類
  3. 裝飾器@classmethod # 以類名的方式訪問
  4. 裝飾器@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.

繼承:代碼復用

  1. 調用屬性和方法
  2. super()調用父類方法
  3. 類名調用父類方法
  4. 子類的類型判斷:isinstance, issubclass
  5. 多繼承:
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.

類, 實例及其他對象的內建函數

  1. hasattr()
  2. getattr()
  3. setattr()
  4. delattr()
  5. vars()
  6. 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]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容