類的方法、變量和繼承

一、 類方法、實例方法、靜態方法、私有屬性

1. 類方法

定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名一般約定爲“cls”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法)

調用:實例對象和類對象都可以調用

應用場景:需要站在類的角度執行某個行爲時,那麼就應該定義爲類方法

2. 實例方法

調用:只能由實例對象調用

3. 靜態方法

定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,但是方法中不能使用類或實例的任何屬性和方法

調用:實例對象和類對象都可以調用

應用場景:存放邏輯代碼,內部不需要引用類屬性和實例屬性

4. 私有屬性

單下劃線開頭:_attr
雙下劃線開頭:__attr
聲明爲私有屬性:聲明爲私有屬性,那麼該說明屬性是類私有的,僅限於在類裏面使用,不要在類外面去調用(實際上類外面可以訪問)

二、 類的繼承關係

1. 什麼是繼承,繼承有什麼用?

面向對象編程中有一個重要的思想叫做繼承,子類通過繼承可以獲得父類的屬性和方法,被繼承的類叫做父類(基類),繼承的類叫做子類。
作用:子類通過繼承可以獲得父類的屬性和方法,提高開發的效率和代碼的複用率。

  • 類屬性可以直接繼承
  • 實例方法通過繼承可以得到
  • 實例屬性是實例對象所獨有的,不能繼承(在創建實例對象的時候賦值)
class MyClass:
    # 類屬性
    attr = 100

    def __init__(self, name, age):
        # 實例屬性
        self.name = name
        self.age = age

    # 實例方法
    def func1(self):
        print('實例方法1')

    # 類方法
    @classmethod
    def c_func(cls):
        print('類方法c_func')

2.調用重名的父類方法

重寫父類的方法:父類有一個方法,繼承之後又定義了一個和父類方法名相同的方法;直接調用自身重寫之後的方法,不會去父類中找
在方法中調用父類重寫前的方法:
方式一:父類名.方法名(self)
方式二:super().方法名()

__new__方法:創建並返回一個新的對象

class Obj(object):
    pass


o = Obj()  # 通過類名創建對象
print(o)

運行結果:

<__main__.Obj object at 0x0022DC90>

3. 屬性動態設置(反射機制)

1). 設置屬性:setattr(object , name , value)
示例:

# 給對象動態設置屬性:參數(對象,屬性名,屬性值)
setattr(case1, 'age', 98)  # 等同於case1.age = 98
print(case1.age)

運行結果:

98

示例:

class Cases:
    def __init__(self, name):
        self.name = name


case1 = Cases('1')

datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}

for k, v in datas.items():
    # print(k, v)
    setattr(case1, k, v)
print(case1.url)

運行結果:

www.baidu.com

2).獲取屬性:getattr(object , name , default)
示例:

class Cases:
    def __init__(self, name):
        self.name = name


case1 = Cases('1')

datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}

for k, v in datas.items():
    print(k, v)
res = getattr(case1, 'name')
print(res)

運行結果:

case_id 1
data 999
url www.baidu.com
1

3).刪除屬性:delattr(object , name)

示例:

class Cases:
    def __init__(self, name):
        self.name = name


case1 = Cases('1')

datas = {'case_id': 1, 'data': '999', 'url': 'www.baidu.com'}

for k, v in datas.items():
    print(k, v)
# setattr(case1, k, v)
# print(case1.url)
# 刪除屬性
delattr(case1, 'name')
# 獲取屬性值
res = getattr(case1, 'name')
print(res)

運行結果:

case_id 1
data 999
url www.baidu.com
Traceback (most recent call last):
  File "E:/PycharmProjects/py23_class/py23_11day/zy_11day.py", line 52, in <module>
    res = getattr(case1, 'name')
AttributeError: 'Cases' object has no attribute 'name'

在python中,萬物皆對象,包括:
函數:函數對象
基本的數據:init數據類型的對象、列表類型的對象、字符串對象、元組對象、字典對象
類:類對象
類創建出來的對象:實例對象
模塊:模塊對象
包:包對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章