本篇博客是滾雪球?qū)W Python 第二輪的最后一篇博客,我們將內(nèi)容繼續(xù)提升到面向?qū)ο蟛糠?,為你補(bǔ)充類里面的一些裝飾器,學(xué)習(xí)之后,希望你的 Python 基礎(chǔ)知識(shí)可以更上一層樓。
十年品牌的成都網(wǎng)站建設(shè)公司,成百上千企業(yè)網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn).價(jià)格合理,可準(zhǔn)確把握網(wǎng)頁(yè)設(shè)計(jì)訴求.提供定制網(wǎng)站建設(shè)、成都商城網(wǎng)站開(kāi)發(fā)、小程序開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等服務(wù),我們?cè)O(shè)計(jì)的作品屢獲殊榮,是您值得信賴的專業(yè)網(wǎng)站設(shè)計(jì)公司。
先直接看代碼,再對(duì)代碼內(nèi)容進(jìn)行分析與學(xué)習(xí)。
首先要掌握的是類函數(shù)的定義格式,在普通函數(shù)的前面添加裝飾器 @classmethod ,該函數(shù)就會(huì)轉(zhuǎn)換為類函數(shù),同時(shí)函數(shù)的第一個(gè)參數(shù)默認(rèn)是 cls ,該變量名可以任意,建議使用成 cls ,這個(gè)是程序員之間的約定。
在 Python 中,大部分 @classmethod 裝飾的函數(shù)末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一個(gè)主要用途是作為構(gòu)造函數(shù)。
先掌握一個(gè)概念,靜態(tài)函數(shù)不屬于它所在的那個(gè)類,它是獨(dú)立于類的一個(gè)單獨(dú)函數(shù),只是寄存在一個(gè)類名下,先建立這個(gè)基本概念,后面學(xué)起來(lái)就簡(jiǎn)單很多了。
在同一個(gè)類中,調(diào)用靜態(tài)方法,使用 類名.函數(shù)名() 的格式。
先創(chuàng)建一個(gè)父類,其中包含兩個(gè)靜態(tài)函數(shù)與一個(gè)類函數(shù)。
再編寫(xiě)一個(gè) S 類繼承自 F 類:
測(cè)試之后,基本結(jié)論如下:
如果在子類中覆蓋了父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是子類自己的靜態(tài)函數(shù),
如果在子類中沒(méi)有覆蓋父類的靜態(tài)函數(shù),那調(diào)用時(shí)使用的是父類的靜態(tài)函數(shù),
類函數(shù)同樣遵循該規(guī)則。
如果希望在子類中調(diào)用父類的屬性或者函數(shù),請(qǐng)使用 父類名. 的形式實(shí)現(xiàn)。
被 @abstractmethod 裝飾的函數(shù)為抽象函數(shù),含抽象函數(shù)的類不能實(shí)例化,繼承了含抽象函數(shù)的子類必須覆蓋所有抽象函數(shù)裝飾的方法,未被裝飾的可以不重寫(xiě)。
抽象類是一個(gè)特殊的類,它的特殊之處在于只能被繼承,不能被實(shí)例化,實(shí)現(xiàn)代碼如下:
抽象基類中學(xué)習(xí)還需要了解元類相關(guān)知識(shí),在第三輪滾雪球?qū)W Python 中將為你展開(kāi)這部分內(nèi)容。
在 Python 面向?qū)ο蟮木幋a過(guò)程中, 對(duì)象.屬性 來(lái)獲取屬性的值,使用 對(duì)象.方法() 來(lái)調(diào)用方法,通過(guò)裝飾器 @property 可以將一個(gè)方法偽裝成屬性,從而使用 對(duì)象.方法 沒(méi)有括號(hào)的形式調(diào)用。代碼非常簡(jiǎn)單:
這種寫(xiě)法最直接的應(yīng)用,就是將部分屬性變成只讀屬性,例如,上述代碼,你無(wú)法通過(guò)下述代碼對(duì) name 進(jìn)行修改。
如果希望方法偽裝的屬性具備修改和刪除功能,需要參考下述代碼:
上述代碼在將 name 方法偽裝成屬性之后,可以通過(guò) @name.setter 和 @name.deleter 對(duì)同名的 name 方法進(jìn)行裝飾,從而實(shí)現(xiàn)了修改與刪除功能。
所以一般使用方法偽裝屬性的步驟是:
如果你覺(jué)得這個(gè)比較麻煩,還存在一種方法偽裝屬性的方式。使用 property 函數(shù),原型如下
通過(guò)上述函數(shù)將方法偽裝成屬性的代碼為:
滾雪球?qū)W Python 第二輪 15 篇博客在一次結(jié)束了,下一輪將在 4 月中旬再次開(kāi)啟,學(xué) Python 我們一直在路上,希望本系列的課程對(duì)你的 Python 學(xué)習(xí)有所助力。
1、抽象類
當(dāng)想要通過(guò)共通接口來(lái)操作一組classes時(shí),便可撰寫(xiě)abstract class。子類中所有與“抽象類所聲明的標(biāo)記式”相符的函數(shù),都會(huì)通過(guò)動(dòng)態(tài)綁定的機(jī)制來(lái)調(diào)用。
有一組類他們擁有一系列相似的行為特征,它們擁有一些共同的函數(shù),我們就把這些共同特征抽取出來(lái)放到抽象類中,抽象類為所有的子類提供“共同的接口”。
建立抽象類的唯一理由是:
各子型別都可以以以不同方式來(lái)表現(xiàn)此一共同接口。達(dá)到多態(tài)性的目的。
注意點(diǎn):
* 抽象函數(shù)只能在抽象類中出現(xiàn)(即,一個(gè)普通的類中,不能聲明抽象函數(shù),一旦聲明,要將該class用abstract做飾詞,否則編譯出錯(cuò))
* 抽象類不能被實(shí)例化。否則編譯出錯(cuò)。
* 只有當(dāng)子類實(shí)現(xiàn)了抽象類中定義的所有函數(shù),該子類才可被實(shí)例化。否則,該子類便也是個(gè)抽象類。
* 也可以將一般的類(不含任何抽象函數(shù)的類)聲明為abstract。表明不允許該類產(chǎn)生任何實(shí)例。
2、接口
完全抽象的class,不帶半點(diǎn)實(shí)現(xiàn)內(nèi)容。interface相當(dāng)于是在類之間建立起的一個(gè)協(xié)議。
interface使得我們可以撰寫(xiě)出“可被向上轉(zhuǎn)型為多個(gè)基本型別”的class,達(dá)到C++多重繼承的變形。
注意點(diǎn):
* 默認(rèn)interface是friendly,可通過(guò)加上關(guān)鍵字public成為public。
* interface中定義的函數(shù)默認(rèn)是public的,因?yàn)樗峁┕餐涌?,需要可以被外界訪問(wèn)。為了增強(qiáng)程序可讀性,可顯式聲明為public。
* 當(dāng)實(shí)現(xiàn)某個(gè)interface,用關(guān)鍵字implement。
實(shí)現(xiàn)類中襲承自interface的函數(shù)必須都要定義為public。一定要顯式寫(xiě)明是public,默認(rèn)就變成friendly,減低了訪問(wèn)權(quán)限,這在Java編譯器中是不允許的。
3、區(qū)別和聯(lián)系
異:
* 抽象類用于支持多態(tài)性,接口用來(lái)支持“多繼承”變形—— 一個(gè)class可向上轉(zhuǎn)型為多個(gè)基本型別。
* 抽象類中函數(shù)既可是抽象的,也可是包含實(shí)現(xiàn)細(xì)節(jié)的。接口只能表示形式,其中函數(shù)必定都是抽象的。
* 抽象函數(shù)中可定義變量。接口只能定義 static/final 的成員變量。
同:
- 抽象類和接口都不能被實(shí)例化。
圖形抽象類的代碼:
abstract class MyShape {
abstract int calGirth(); //求周長(zhǎng)
abstract double calSquare(); //求面積
}
三角形類的實(shí)現(xiàn):
public class Triangle extends MyShape{
int borderA, borderB, borderC;
Triangle(int a, int b, int c){borderA = a; borderB = b; borderC = c;}
Triangle(){borderA = borderB = borderC = 0;}
@Override
int calGirth() {
return borderA + borderB + borderC;
}
@Override
double calSquare() {
double p = calGirth() / 2;
return Math.sqrt(p * (p - borderA) * (p - borderB) * (p - borderC));
}
public static void main(String[] args) {
Triangle test = new Triangle(3, 4, 5);
System.out.println("The girth of the triangle is " + test.calGirth());
System.out.println("The square of the triangle is " + test.calSquare());
}
}
實(shí)現(xiàn)兩個(gè)抽象函數(shù),測(cè)試結(jié)果正確,輸出為:
The girth of the triangle is 12
The square of the triangle is 6.0
Java程序:
//抽象人類
abstract?class?Person?{
//薪水
protected?double?salary;
public?Person()?{
this.salary?=?0;
}
public?Person(double?salary)?{
this.salary?=?salary;
}
//抽象方法
abstract?void?pay();
}
//工人類
class?Worker?extends?Person?{
public?Worker(double?salary)?{
super(salary);
}
@Override
void?pay()?{
System.out.println("工人工資:"?+?salary);
}
}
//程序員類
class?Programmer?extends?Person?{
public?Programmer(double?salary)?{
super(salary);
}
@Override
void?pay()?{
System.out.println("程序員工資:"?+?salary);
}
}
public?class?Main?{
public?static?void?main(String[]?args)?{
Person?p; //聲明抽象類對(duì)象
p?=?new?Worker(5000); //用子類實(shí)例化抽象類對(duì)象
p.pay(); //調(diào)用被實(shí)現(xiàn)的方法
p?=?new?Programmer(8000); //用子類實(shí)例化抽象類對(duì)象
p.pay(); //調(diào)用被實(shí)現(xiàn)的方法
}
}
運(yùn)行測(cè)試:
工人工資:5000.0
程序員工資:8000.0
//Shape.java
public interface Shape{
public double calarea();
}
//Rectangle.java
public class Rectangle implements Shape{
private double length;
private double high;
public Rectangle(double length,double high){
this.length = length;
this.high = high;
}
public double calarea(){
return length*high;
}
}
//Circle Circle.java
public class Circle implements Shape{
private double radius;
public double calarea(){
return Math.PI*radius*radius;
}
public Circle(double radius){
this.radius = radius;
}
}
//Test.java
public class Test{
public static void main(String []args){
Shape recShape = new Rectangle(2.7,4.8);
Shape cirShape = new Circle(5.0);
System.out.println(recShape.calarea());
System.out.println(cirShape.calarea());
}
}
直接手寫(xiě)的,辛苦吧
新聞名稱:java抽象函數(shù)代碼,JAVA抽象類和抽象方法
網(wǎng)站鏈接:http://jinyejixie.com/article36/dssidsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、品牌網(wǎng)站建設(shè)、微信小程序、ChatGPT、網(wǎng)站排名、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)