面向對象的接口類 以及鴨子類型

?

1.接口類,抽象類.

2.鴨子類型(Python多態)(Python三大特性之一)Python封裝

1.接口類和抽象類只是在工作中書寫的一種規范.

class QQ:

  def? pay(self,money):

    print("使用QQ支付%s"%money)

class Ali:

  def pay(self,money):

    print("使用支付寶支付%s"%money)

q = QQ()

q.pay(100)

a = Ali()

a.pay(200)

上面的例子,沒有統一化.不方便之后的開發

class QQ:

  def pay(self,money):

    print("使用QQ支付%s"%money)

class Ali:

  def pay(self,money):

    print("使用支付寶支付%s"%money)

def pay(self,money):

  self.pay(money)

q = QQ()

a = Ali()      #這樣就實現了統一化

pay(q,100)

pay(a,200)

以上這版實現了統一化,但是交接的時候,新來的看不懂就會按照自己的方法寫.看下面

class QQ:

  def pay(self,money):

    print("使用QQ支付%s"%money)

class Ali:

  def pay(self,money):

    print("使用支付寶支付%s"%money)

class Wechat:

  def wepay(self,money):

    print("使用微信支付%s"%money)

def pay(self,money):

  self.pay(money)

q = QQ()

a = Ali()

pay(q,100)

pay(a,200)

w = Wechat()    #新來的員工按照自己方法添加了一種,但是不規范.

w.wepay(500)

我們看一下下面的方法.

class Payment:

  def pay(self):pass

class QQ(Payment):

  def pay(self,money):

    print("使用QQ支付%s"%money)

class Ali(Payment):

  def pay(self,money):

    print("使用支付寶支付%s"%money)

class Wechat(Payment):

  def pay(self,money):

    print("使用微信支付%s"%money)

def pay(self,money):

  self.pay(money)

q = QQ()

a = Ali()

w = Wechat()

pay(q,100)
pay(a,200)

pay(w,500)

以上便是為了規避方法不統一的方法.下面的例子便是強制統一,不同一便報錯.

from abc import ABCMeta , abstractmethod

class Payment(metaclass = ABCMeta):

  @abstractmethod

  def pay(self):pass

class? QQ(Payment):

  def pay(self,money):

    print("使用QQ支付%s"%money)

class Ali(Payment):

  def pay(self,money):

    print("使用支付寶支付%s"%money)

class Wechat(Payment):

  def pay(self,money):

    print("使用微信支付%s"%money)

def pay(self,money):

  self.pay(money)

q = QQ()

a = Ali()

w = Wechat()

pay(q,100)

pay(a,200)    #強制統一化.沒有統一便會報錯

pay(w,500)

抽象類(接口類)用處:在工作中,如果要是規定幾個類必須有一樣的方法,要抽象類.制定一個規范,強制其有此方法.

Python沒有多態的概念,但是Python崇尚鴨子類型.

Python中好多不同類但同名的方法不是強制規定,而是約定俗成的,像str,list,tuple這三種類,都同樣具有index方法,而且功能相似,則他們三個互稱為鴨子.

封裝就是將一些屬性或者方法(有用的信息)放置在一個空間中.

1.封裝? ? 對象的封裝

class? A:

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

    self.age = age

p = A("alex",23)

print(p.name)

2.封裝(私有成員)

類的結構分析:

class Person:

  mind = "有思想"  #第一部分:所有的公有靜態變量,公有靜態字段

  __level = "高等動物"  #第一步分:私有靜態變量,私有靜態字段

  def __init__(self,name,age,sex):  #構造方法,第二部分:動態方法,方法(函數)

    self.name = name

    self.age = age    #公有對象屬性

    self.__sex = sex  #私有對象屬性

  def func(self):    #第二部分:普通方法

    print(666)

  def __func1(self):    #第二部分:私有方法

    print(777)

  @staticmethod    #靜態方法

  def f2():pass

  @classmethod    #類方法

  def f2(self):pass

  @property      #屬性

  def hex(self):pass

類的整體分類:

第一部分:公有靜態字段: mind = "有思想"

    私有靜態字段: __level = "高等動物"

第二部分:特殊方法(__init__,__str__ ....)

    普通方法:def func(self)

    私有方法:def __func1(self)

    類方法:@classmethod

    靜態方法:@staticmethod

    屬性:@property

私有成員:私有靜態字段,私有屬性,私有方法.在變量前加__雙下劃線.

class Animal:

  __cloth = "有皮毛"

class Person(Animal):

  mind = "有思想"

  __level = "高等動物"

  def __init__(self,name,age):

    self.name = name

    self.age = age

?? def func(self):

    print(self.__level)  #類自己在內部訪問自己的私有屬性

    print(self._Animal__cloth)  #知道這種方法可以,但是禁止使用.

    print(self.__cloth)  #派生類不可訪問父類的私有屬性

在類的外面訪問:私有靜態字段是訪問不到的.

p = Person("alex",100)

print(p.mind)

print(p.__level)  #這樣訪問會報錯.

print(Person.__level)   #這樣訪問也是會報錯的.

print(Person.__dict__)

print(Person._Person__level)  #這個方法知道就可以了,但是禁止使用.

#可以通過? ?對象._類名__變量名? 類名._類名__變量名? 可以訪問到,但是絕對不要這樣做

在類的內部: 私有靜態字段是可以訪問的.

p.func()

父類的私有字段,派生類是否可以訪問? 答案是:不可以

print(p.__cloth)

p.func()    #這兩種都會報錯.因為在外部是不可訪問父類的私有字段.

私有方法:

class Animal:

  def f1(self):

    print(111)

class Person(Animal):

  def __init__(self,name,age,sex):

    self.name = name

    self.age = age?

    self.__sex = sex

  def __func(self):

    print(6666)

  def func1(self):

    self.__func()

  def func2(self):

    self.__f1()

類外面訪問不到:

p = Person("oldboy",200)

p.__func()

類的內部可以訪問:

p.func1()

派生類也是訪問不到的

p.func2()

私有屬性也是類外部不能訪問,派生類不能訪問,只能類內部訪問.

總結:對于私有成員來說,加載到內存時,都會加上_類名__變量名,所以在類的外部或者派生類中都不可訪問.

為什么設置私有成員?

有些變量,方法,屬性只在類內部進行使用即可不便于(不允許)類外部或者派生類去調用.

class A:

  def __init__(self):

    self.__func()

  def __func(self):

    print("in? ?A")

class B(A):

  def __func(self):

    print("in? ?B")

b = B()

這是一道面試題, 打印的結果是什么,為什么結果是這樣的.

?

轉載于:https://www.cnblogs.com/fengkun125/p/9255743.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql查看binlog日志內容

2019獨角獸企業重金招聘Python工程師標準>>> (一) binlog介紹 binlog,即二進制日志,它記錄了數據庫上的所有改變,并以二進制的形式保存在磁盤中; 它可以用來查看數據庫的變更歷史、數據庫增量備份和恢復、Mysql的復制&…

架構師:我們需要頂層設計

架構師:我們需要頂層設計背景: 某公司,建立的程序又被推倒,外人覺得很奇怪,這個程序的主管非常敬業,關注到了程序每一個細節,甚至包括每一個按鈕的文字和位置。這個主管很委屈,他說…

文件傳輸協議FTP

文件傳輸協議FTP提供交互式的訪問,允許客戶指明文件的類型和格式,并允許文件具有存取權限。它屏蔽了個計算機系統的細節,因而適合于在異構網絡中任意計算機之間傳輸文件。它提供不同種類主機系統之間的文件傳輸能力,可以提供用戶對…

Centos7安裝Docker教程

1.首先安裝必要依賴: sudo yum install -y yum-utils device-mapper-persistent-data lvm22.然后添加倉庫源: sudo sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.最后安裝 Docker&#xff…

String.format() 方法用法解說

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 String chargeFlowUrl _AGENT_URL "?agentAccount" _AGENT_ACCOUNT "&sequence%s &phone%s &iceUrl%s &…

Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 錯誤的解決

大意是Log4jConfigListener在獲取webapp.root值時&#xff0c;被后一context的值替換掉了&#xff0c;所以要在各個項目的web.xml中配置不同的webAppRootKey值&#xff0c;隨即在其中一個web.xml中添加&#xff1a; <context-param> <param-name>webAppRootKey<…

ionic3 cordova ionic-native插件

ionic-native插件 cordova安裝插件 以及 ionic-native插件使用過程以及步驟 cordova plugin add cordova-plugin-插件名稱。 //安裝插件npm install ionic-native/對應插件名稱 --save。 //寫入package.json在app.module.ts 的 providers 進行引用解釋&#xff1a;cordove plug…

Diango博客--19.使用 Docker部署項目到線上服務器

文章目錄1.克隆代碼到服務器2.創建環境變量文件用于存放項目敏感信息3.在 .production 文件寫入下面的內容并保存4.修改 Nginx 配置5.修改項目配置文件6.啟動容器7.檢查容器啟動狀況8.配置 HTTPS 證書&#xff08;沒有配置域名無法配置&#xff0c;只能通過服務器 ip 以 HTTP 協…

從一生的角度看程序員的學習和發展

很多人談學習和發展的時候&#xff0c;往往忽略人的先天自然條件&#xff0c;在這里我們從這個視角切入&#xff0c;來探討一下程序員一生的可能軌跡。 如果把程序員的人生分為三個階段&#xff0c;那么他們是&#xff1a; 畢業~30歲&#xff1a;這個時間段里&#xff0c;大多…

Jquery Datatable 數據填充報錯:requested unknown parameter ‘XXX‘ for row xx, column xx 解決方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如圖&#xff1a; 解決方法見官網&#xff1a;https://datatables.net/manual/tech-notes/4 摘要如下&#xff1a; Parameter is an…

Tarjan-縮點

$Tarjan$縮點 Tarjan的第二個應用就是求縮點啦。縮點雖然比割點麻煩一點&#xff0c;但是用處也比割點要大不少。 本來要學另外兩個縮點算法的,但是似乎沒什么用...$MST$里確實有只能有$prim$或者只能用$kruscal$的題目&#xff0c;但是這三種縮點...在網上沒有找到介紹它們之間…

mysqldump參數詳細說明(轉)

Mysqldump參數大全&#xff08;參數來源于mysql5.5.19源碼&#xff09; 參數 參數說明 --all-databases , -A 導出全部數據庫。 mysqldump -uroot -p --all-databases --all-tablespaces , -Y 導出全部表空間。 mysqldump -uroot -p --all-databases --all-tablespaces --n…

Diango博客--20.開啟 Django 博客的 RSS 功能

1.Rss簡介 博客提供 RSS 訂閱應該是標配&#xff0c;這樣讀者就可以通過一些聚合閱讀工具訂閱你的博客&#xff0c;時時查看是否有文章更新&#xff0c;而不必每次都跳轉到博客上來查看。現在我們就來為博客添加 RSS 訂閱功能。 RSS&#xff08;Really Simple Syndication&am…

什么是P2P

P2P技術又稱為點對點傳輸技術。舉個簡單的例子&#xff0c;以便可以更好的理解。比如&#xff0c;以前我們要下載一個文件&#xff0c;我們一定要從服務器下載。有了P2P技術之后&#xff0c;我們可以向其它下載過這個文件的電腦獲取這個文件&#xff0c;我下載完成了這個文件之…

SQL語句使用大全,最常用的sql語句

下列語句部分是Mssql語句&#xff0c;不可以在access中使用. SQL分類&#xff1a; DDL—數據定義語言(Create&#xff0c;Alter&#xff0c;Drop&#xff0c;DECLARE) DML—數據操縱語言(Select&#xff0c;Delete&#xff0c;Update&#xff0c;Insert) DCL—數據控制語言(…

Oracle 的 SQL語句中 decode()函數

decode()函數簡介&#xff1a; 主要作用&#xff1a;將查詢結果翻譯成其他值&#xff08;即以其他形式表現出來&#xff0c;以下舉例說明&#xff09;&#xff1b; 使用方法&#xff1a; Select decode&#xff08;columnname&#xff0c;值1,翻譯值1,值2,翻譯值2,...值n,翻譯值…

百度王一男: DevOps 的前提是拆掉業務-開發-測試-運維中間的三面墻

這是一個創建于 375 天前的主題&#xff0c;其中的信息可能已經有所發展或是發生改變。由數人云、優維科技、中生代社區聯合發起的 系列 Meetup 《 DevOps&SRE 超越傳統運維之道》 先后在深圳、北京舉行過兩場 7 月 15 日上海站&#xff0c;敬請期待 ▼ 王一男老師在《 Dev…

linux上mongodb的安裝與卸載

安裝 1.下載安裝包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下載完成后解壓縮壓縮包 tar zxf mongodb-linux-i686-1.8.2.tgz 2. 安裝準備 將mongodb移動到/usr/local/server/mongdb文件夾 mv mongodb-linux-i686-1.8.2 /usr/local/mongodb 創建數據…

面向對象設計的準則

1.模塊化 對象就是模塊 把數據結構和操作這些數據的方法緊密地結合在一起 2.抽象 過程抽象 數據抽象&#xff1a;類 參數化抽象&#xff1a;C的“模板” 3.信息隱藏 通過對象的封裝性實現類&#xff0c;分離了接口與實現&#xff0c;支持信息隱藏 4.弱耦合 某一部分的…

Linux觸發連鎖反應,惠及全球

所謂“連鎖反應”是指&#xff0c;若干個相關的事物&#xff0c;只要一個發生變化&#xff0c;其他都跟著發生變化。在軟件界的“圈子”里面&#xff0c;一般而言&#xff0c;“連鎖反應”這個詞匯是不經常使用的。 4月21日&#xff0c;芬蘭科學院把2012年最高技術成就獎授予Li…