天天看點

python程式設計練習(小甲魚)第36-40課(super()函數用法)

1.類:抽象的,包括屬性和方法,比如矩形類,屬性可以是長寬,方法(也就是函數)可以是計算面積周長。

2.按照以下提示嘗試定義一個Person類并生成執行個體對象。

屬性:姓名(預設姓名為“小甲魚”)

方法:列印姓名

提示:方法中對屬性的引用形式需加上self,如self.name

class Person:
    name = '小甲魚'#屬性

    def printt(self):#方法
        print(self.name)#方法中對屬性的引用
a = Person()
a.printt()
           

3.按照以下提示嘗試定義一個矩形類并生成類執行個體對象。

屬性:長和寬

方法:設定長和寬 -> setRect(self),獲得長和寬 -> getRect(self),獲得面積 -> getArea(self)

提示:方法中對屬性的引用形式需加上self,如self.width

class juxing:
    chang = 4
    kuan = 2
    def setRect(self):
        self.chang = int(input('請輸入長:'))
        self.kuan = int(input('請輸入寬:'))
    def getRect(self):
        print('矩形的長為:%d,寬為:%d'%(self.chang,self.kuan))
    def getArea(self):
        s = self.chang * self.kuan
        print('矩形的面積為:',s)
m = juxing()
m.setRect()
m.getArea()
m.getRect()
           

4.self參數的作用:self指向的是類的執行個體化對象,使得程式能夠判斷是哪個對象在調用方法。

5.不希望對象的屬性和方法被外部直接引用時,可以在名字前加入雙下劃線,例如:__name。

6.__init __方法會在類執行個體化時被自動調用,相當于對對象的初始化,是一種魔法方法,可重寫,不應該傳回除了none以外的任何對象。

7.明确類,類對象,類的執行個體化對象

在建立類時就生成了一個類對象,此對象可以調用類的屬性,不可以直接調用類的方法,執行個體化對象才可以調用方法。

8.按照以下要求定義一個遊樂園門票的類,并嘗試計算2個成人+1個小孩平日票價。

平日票價100元

周末票價為平日的120%

兒童半票

class Ticket:
    def __init__(self, weekend=False, child=False):#初始化設定
        self.price = 100
        self.increase = 1
        self.discount = 1
        if weekend:
            self.increase = 1.2
        if child:
            self.discount = 0.5

    def Price(self, num):
        return self.price * self.increase * self.discount * num

adult = Ticket()
child = Ticket(child=True)
print("2個大人 + 1個小孩平日票價為:%.2f元" % (adult.Price(2) + child.Price(1)))
           

9.super()函數:

在類的繼承中,如果重新定義了某個方法,則這個方法将會覆寫父類的同名方法,當想同時實作子類和父類的這一方法時,可以使用兩種方法,一個是:直接調用未綁定的父類方法;一個是:使用super()函數。

調用未綁定的父類方法,但是在多重繼承中會出現問題。

class B:
    def ss(self):
       pass
class A(B):
    def ss(self):
        B.ss(self)  #調用父類方法
        pass
           

使用super()函數,常用于多重繼承。

class B:
    def ss(self):
       pass
class A(B):
    def ss(self):
        super(A,self).ss()  #先找到類A的父類B,然後将類A的對象轉化為類B的對象,最後調用ss方法。
        #也可以直接super().ss()#python3寫法
        pass
           

一般,super()函數最常見的方法就是在子類中調用父類的初始化方法。

class B:
    def __init__(self, a, b):
        self.a = a
        self.b = b
class A(B):
    def __init__(self, a, b, c):
        super().__init__(a, b)
        self.c = c
           

10.多态,一個事物的多種狀态,在python中讓具有不同功能的函數使用相同的函數名,進而可以用一個函數名調用不同功能的函數。

11.定義一個點(Point)類和直線(Line)類,使用getLen方法可以獲得直線的長度。

提示:

1.設點A(X1,Y1)、B(X2,Y2)

2.Python中計算開根号可使用math子產品中的sqrt函數

3.直線需有兩點構成,是以初始化時需要有兩個點(Point)對象作為參數

import math as m
class point():
    def __init__(self, x, y):#設定x,y
        self.x = x
        self.y = y
    def getx(self):#獲得x,y
        return self.x
    def gety(self):
        return self.y
class line():
    def __init__(self,p1,p2):
        self.x = p1.getx()-p2.getx()
        self.y = p1.gety()-p2.gety()
    def getLen(self):
        self.len = m.sqrt(self.x**2+ self.y**2)
        print('%.2f'%self.len)
p1 = point(3, 1)
p2 = point(1, 4)
line = line(p1, p2)
line.getLen()
           

11.組合:在類定義中直接把需要的類放進去執行個體化。

class Turtle:
    pass
class Fish:
    pass
class Pool:
    def __init__(self, x, y):
        self.turtle = Turtle(x)  # 直接把需要的類放進去執行個體化
        self.fish = Fish(y)
           

12.請動手在一個類中定義一個變量,用于跟蹤類有多少個執行個體被建立(當執行個體化一個對象,這個變量+1,當銷毀一個對象,這個變量自動-1)。

類屬性通常用來跟蹤與類相關的值。

class C:
    count = 0#類屬性
    def __init__(self):#自動調用進行初始化
        C.count += 1
    def __del__(self):
        C.count -= 1