1. 程式人生 > >19 抽象類 接口類 封裝. 多態

19 抽象類 接口類 封裝. 多態

函數 執行 pyhon 傳參 自動 func def 外部 __init__

主要內容:

1. 抽象類(接口類):

  制定一個規範 :

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self):pass

class Alipay(Payment):
    def __init__(self,money):
        self.money = money
    def pay(self):
        print(‘使用支付寶支付了%s‘ % self.money)
class Jdpay(Payment):
    def __init__(self,money):
        self.money = money
    def pay(self):
        print(‘使用京東支付了%s‘ % self.money)
class Wechatpay(Payment):
    def __init__(self,money):
        self.money = money
    def pay(self):
        print(‘使用微信支付%s‘ % self.money)
def pay(obj):             #歸一化設計.
    obj.pay()
a = Alipay(200)
j = Jdpay(500)
w = Wechatpay(300)
pay(a)
pay(j)
pay(w)

2. 多態:python處處是多態,python:弱類型語言.

  java:強類型語言.

  python不管是什麽類型,傳入函數,封裝到對象都可以.

  Pyhon不支持Java和C#這一類強類型語言中多態的寫法,但是原生多態,其Python崇尚“鴨子類型”

這些類:都互稱為鴨子類型.

class Str:
    def index(self):
        pass
class List:
    def index(self):
        pass
class Tuple:
    def index(self):
        pass

3. 封裝

  a: 私有靜態字段:類的內部可以訪問,類的外部不可以訪問.

        對於私有靜態字段來說,只有在本類中內部訪問,類的外部,派生類均不可訪問.

class B:
    __money = 1000
class A(B):
    name = ‘lily‘
    __age = 20
    def func(self):
        print(self.__age)  #在類的內部實例化對象可以訪問私有靜態字段.
        print(A.__age)     #在類的內部類名可以訪問私有靜態字段.
    def func1(self):
        # print(self.__money)  #對於私有靜態字段,只有本類中內部可以訪問,類的外部派生類都不可以.
        # print(A.__money)
        pass
a1 = A()
a1.func()
# print(a1.__age)    #在類的外部,實例化對象不能訪問類中的私有靜態字段
# print(A.__age)     #在類的外部,類名不能訪問私有靜態字段
a1.func1()

  b: 私有方法:類的內部可以訪問,類的外部和派生類都不可以訪問.

class B:
    __money = 1000
    def __fn(self):
        print(‘B‘)
class A:
    name = ‘lily‘
    __age = 20
    def __func(self):
        print(‘func,,,,‘)
    def func1(self):
        self.__func()    #在類的內部可以訪問私有方法.
        # self.__fn()    #在類的外部.派生類均不可以訪問靜態方法.
a1 = A()
# a1.__func()           #類的外部不可以訪問私有方法
a1.func1()
# print(B._B__money)   #盡量不要用.
# print(a1._A__age)
# print(A._A__age)
a1._A__func()
A._A__func(1)          #類名去訪問類中的方法.一定要傳參數.

 c : 面試題:

class Parent:
    def __func(self):     #_Parent__func
        print(‘in Parent func‘)

    def __init__(self):
        self.__func()

class Son(Parent):
    def __func(self):
        print(‘in Son func‘)

son1 = Son()     #實例化一個對象son1,自動執行_init_方法,  執行self.__func(),內部實際self._Parent__func
                 #子類中沒有,然後執行  ‘in parent func‘
print(Parent.__dict__)

  

 

  

19 抽象類 接口類 封裝. 多態