2014-04-15 160 views
1

我是一位OOP的初學者,一直試圖用Python3自學一些它的概念。但是,我已經陷入了繼承。這是我的源代碼:Python 3繼承

#! /usr/bin/env python3 

class TwoD: 
    def __init__(self, height, width): 
    self.h = height 
    self.w = width 
def perimeter(self, height, width): 
    return 2 * (height + width) 
def area(self, height, width): 
    return height * width 

class Cuboid(TwoD): 
def __init__(self, height, width, depth): 
    self.d = depth 
def volume(self, height, width, depth): 
    return height * width * depth 

x = Cuboid(3, 4, 5) 
print(x.volume()) 
print(x.perimeter()) 
print(x.area()) 

我運行它時得到的錯誤如下。它看起來好像我需要向卷添加參數,但不提供它所需的變量?

Traceback (most recent call last): 
File "./Class.py", line 19, in <module> 
print(x.volume()) 
TypeError: volume() missing 3 required positional arguments: 'height', 'width', and 'depth' 

所以有人請讓我知道我做錯了什麼。我相信這是愚蠢的。另外,有人可以解釋我將如何去在Python3中使用多繼承?

在此先感謝

+0

請用4個空格替換您的所有選項卡。 –

回答

2

由於在__init__()方法,則需要創建兩個數據屬性self.hself.w,您可以在其他方法使用它們,所以沒有必要通過任何參數:

def perimeter(self): 
    return 2 * (self.h + self.w) 

def area(self): 
    return self.h * self.w 

另外,在Cuboid類的__init__()方法中,不要忘記調用super,所以self.hself.w變成數據屬性

1

它看起來好像我需要爲卷添加參數,但是x 是否提供了所需的變量?

是的,確實如此,這意味着你不應該讓他們在所有的方法定義:

class TwoD: 
    def __init__(self, height, width): 
     self.h = height 
     self.w = width 
    def perimeter(self): 
     return 2 * (self.h + self.w) 
    def area(self): 
     return self.h * self.w 

等等。所以實際上它不是繼承問題,而是你的代碼根本不是面向對象的。