1. 程式人生 > 實用技巧 >python繼承和動態屬性

python繼承和動態屬性

一、私有屬性

私有屬性: __開頭或者_開頭,即雙下劃線開頭的叫做私有屬性,不能再類外部使用,只能在類裡面使用

私有方法:__開頭或者_開頭

注意點:以後看到_下劃線開頭的屬性或者方法,都不要去動或者使用

class SOS:
    attr = 100
    _attr = 222  # 這是單下劃線,在外部訪問,但是不要在類外部使用
    __attr = 999   # 這是雙下劃線,強制拒絕外部訪問


print(SOS.attr)   # 打印出 100
print(SOS.__attr)    # 報錯!!!因為是私有屬性,所以訪問不到

二、繼承

# 預設繼承
class 類名:

  pass

class 類名(繼承的父類):
  pass

object(基類):python中所有類的祖宗(所有的類都繼承於它)

繼承:子類通過繼承能夠擁有父類的屬性和方法(私有屬性和私有方法除外)

class BaseClass:
    attr = "base"

    def func(self):
        print("--------base---func---------")


class MyClass(BaseClass):
    def func2(self):
        print("--------自己的的func2---------
") # 例項化一個物件m m = MyClass() print(m.attr) # 打印出 base m.func() # 打印出 --------base---func--------- m.func2() # 打印出 --------自己的的func2---------

2.1 繼承示例

# 案例一:通過繼承方法去實現
# 手機一代
# 手機二代
# 手機三代

# 1995年的手機
class PhoneV1:
    """手機一代"""

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

    def
call_phone(self): print(f"{self.name}使用了打電話的功能") # 2002年的手機 class PhoneV2(PhoneV1): """手機二代""" def listen_music(self): print(f"{self.name}使用了聽音樂的功能") def send_msg(self): print(f"{self.name}使用了發簡訊的功能") # 2010年的手機 class PhoneV3(PhoneV2): """手機三代""" def game(self): print(f"{self.name}使用了玩遊戲的功能") def pay(self): print(f"{self.name}使用了支付的功能") m = PhoneV3("oppo") m.call_phone() # oppo使用了打電話的功能

2.2 重寫父類方法

重寫父類方法(重點!!!):在子類中定義一個和父類重名的方法,工作中常用

class Base(object):
    def base_func(self):
        print("----Base----base_func---------")


class A(Base):
    def base_func(self):
        print("----A子類----base_func---------")

        # 方式一:父類名.方法名(self)
        Base.base_func(self)
        # 方式二:super().方法名
        super().base_func()

# 例項化物件a
a = A()
# 呼叫子類中的自己的方法,雖然重寫了方法,但會直接覆蓋,會呼叫子類的方法
a.base_func()   # 打印出 ----A子類----base_func---------

# 如果想呼叫父類中的方法呢?怎麼辦?

重寫方法的實際應用場景:看下面的程式碼

應用場景:
  父類原有的方法不能滿足原有的需求,需要對父類中的方法進行擴充套件

開放封閉原則:
  已經實現的功能不要進行修改(對修改是封閉的)
  對擴充套件的功能是開放的

class BaseClass(object):
    # 姓名、身高
    def __init__(self, name, height):
        self.name = name
        self.height = height


class MyClass(BaseClass):
    # 姓名、身高、年齡、性別
    def __init__(self, name, height, age, sex):
        # 呼叫父類的方法
        super().__init__(name, height)
        # 重寫之後擴充套件的功能程式碼
        self.age = age
        self.sex = sex

    def func(self):
        pass


# 例項化物件c
c = MyClass("jack", 172, 18, "boy")
print(c)

三、屬性動態設定