2012-02-19 52 views
22

Giả sử tôi có hai lớp (một phụ huynh và một lớp con). Làm thế nào để tôi tham chiếu đến một phương thức trong lớp cha nếu phương thức cũng được định nghĩa trong phân lớp khác nhau?làm thế nào để tham khảo một phương pháp cha mẹ trong python?

Đây là mã:

class A: 
    def __init__(self, num): 
     self.value=num 
    def f(self, num): 
     return self.value+2 
class B(A): 
    def f(self, num): 
     return 7*self.f(num) 

Trong dòng cuối cùng, tôi muốn đề cập đến các tầng lớp phụ huynh A với "self.f (num)" lệnh, không phải là phương pháp riêng của mình trong B mà sẽ tạo ra một đệ quy vô hạn. Cảm ơn bạn trước.

Trả lời

28

Nếu bạn biết bạn muốn sử dụng Một bạn cũng có thể rõ ràng ám chỉ đến A theo cách này :

class B(A): 
    def f(self,num): 
     return 7 * A.f(self,num) 

Hãy nhớ rằng bạn phải cung cấp một cách rõ ràng đối số tự cho hàm thành viên A.f()

+0

Tôi đã có một lỗi với làm điều đó, khi tôi đã cố gắng gọi một phương pháp, được thực hiện trong C. Nó dự kiến ​​một thể hiện của A là tham số đầu tiên và không nhận ra B là một lớp con. Tôi cho rằng việc sử dụng super() có thể làm được điều đó, nhưng tôi vẫn chưa chắc chắn. – erikbwork

35

Sử dụng super:

return 7 * super(B, self).f(num) 

Hoặc trong python 3, nó chỉ là:

return 7 * super().f(num) 
+0

lý thuyết này đúng, nhưng vì lý do nào đó, tôi nhận được: TypeError: siêu() đối số 1 phải là loại, không phải classobj – user1111042

+6

@ user1111042: Hãy để tôi đoán - bạn đang sử dụng Python 2.x? Sau đó, lớp __ của bạn sẽ kế thừa từ _object_, chỉ khi đó bạn mới có được một lớp kiểu mới. Các lớp kiểu mới là các cá thể của lớp _type_, trong khi các lớp kiểu cũ chỉ là các cá thể của _classobj_. _super() _ chỉ hoạt động trên các lớp kiểu mới. – pillmuncher

+0

Có, tôi đang sử dụng Python 2.x và siêu như bạn đã nói không hoạt động trong 2.x – user1111042

1
class B(A): 
    def f(self, num): 
     return 7 * super(B, self).f(num) 
1

Tại sao không giữ cho nó đơn giản?

class B(A): 
    def f(self, num): 
     return 7 * A.f(self, num) 
0

bạn có thể sử dụng siêu hoặc nếu bạn có thể rõ ràng hơn và làm điều gì đó như thế này.

class B(A): 
    def f(self, num): 
    return 7 * A.f(self, num) 
5

Phù hợp với câu trả lời khác, có rất nhiều cách để gọi các phương thức lớp siêu (bao gồm cả các nhà xây dựng), tuy nhiên trong Python-3.x quá trình này đã được đơn giản hóa:

Python-2 .x

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super(B, self).__init__() 

Python-3.x

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super().__init__() 

super() giờ đây tương đương với super(<containing classname>, self) theo the docs.

Các vấn đề liên quan