2010-06-18 27 views
6

Tôi đã đọc các tài liệu Python về classes và đi qua đoạn này mà tôi không chắc chắn về:Calling overriden phương pháp trong lớp có nguồn gốc từ Base Class

lớp Derived có thể ghi đè lên các phương pháp của lớp cơ sở của họ. Bởi vì phương pháp không có ưu đãi đặc biệt khi gọi các phương pháp khác của cùng một đối tượng , một phương pháp của một lớp cơ sở mà gọi một phương pháp được định nghĩa trong lớp cùng cơ sở có thể sẽ gọi một phương thức của một lớp được thừa kế mà ghi đè nó. (Đối với các lập trình viên C++: tất cả các phương pháp trong Python là một cách hiệu quả ảo.)

Ví dụ:

class A: 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from A" 

class B(A): 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print "from B" 

Điều này có nghĩa rằng một đối tượng của lớp A obj = A() bằng cách nào đó có thể kết thúc in "từ B" ? Tôi có đọc chính xác không? Tôi xin lỗi nếu điều này không có ý nghĩa. Tôi là một chút bối rối như thế nào python xử lý Thừa kế và ghi đè. Cảm ơn!

Trả lời

6

Không. Không có cách nào mà lớp cha có thể biết gì về lớp con. Điều đó nghĩa là nếu bạn khởi tạo lớp con B và nó kế thừa phương thức foo() và ghi đè phương thức bar(), thì khi bạn gọi foo(), điều này sẽ gọi định nghĩa bar() trong B, chứ không phải định nghĩa bar(). các nhà văn siêu lớp dự định - ông dự kiến ​​cuộc gọi của mình để bar() để đi đến định nghĩa của riêng mình.

0

Không, bất kỳ đối tượng đó là một A sẽ gọi A.bar và in "from A"

Những phương pháp ghi đè được gọi là phụ thuộc vào những gì đối tượng , không phải những gì các lớp khác có thể được bắt nguồn từ lớp học của mình. Hãy nghĩ về lớp như một công cụ cắt cookie và đối tượng là cookie.

+0

Để mở rộng, từ tác là _may_ gọi một phương thức của một lớp dẫn xuất. 'obj = B()' _would_ in "từ B". –

0

Không chính xác:

class A: 
    def foo(self): 
     self.bar() 

    def foo2(self): 
     self.bar2() 

    def bar(self): 
     print "Bar A" 

    def bar2(self): 
     print "Bar2 A" 

class B(A): 
    def bar(self): 
     print "Bar B" 

objA = A() 
objA.foo() 
objA.foo2() 

objB = B() 
objB.foo() 
objB.foo2() 

Output:

Bar A 
Bar2 A 
Bar B 
Bar2 A 
1

Không, nó có nghĩa là bạn nếu bạn đã theo đối tượng:

class B(A): 
    def bar(self): 
     print "from B" 

và bạn làm

obj = B() 
obj.foo() 
.210

thì đây sẽ in from B như foo(), được định nghĩa trong lớp cơ sở , gọi bar(), mà cũng được định nghĩa trong lớp cơ sở, nhưng ghi đè trong lớp có nguồn gốc.

Ít nhất đây là cách tôi đọc nó.

1
a = A() 
a.foo() 
b = B() 
b.foo() 
a.bar = b.bar 
a.foo() 

đầu ra:

from A 
from B 
from B 
0

câu trả lời của tôi không nhất thiết phải mâu thuẫn với những người đăng tải đã có, nhưng nó cho thấy một cách để có được những lớp cơ sở để in "từ B" bằng cách gọi lớp cơ sở phương thức từ lớp kế thừa. Lớp cơ sở vẫn gọi phương thức lớp kế thừa vì nó đang làm việc từ bản thân được thừa hưởng. Có lẽ đây là loại tình huống đoạn văn đề cập đến?

class A: 
    def foo(self): 
     self.bar() 

    def bar(self): 
     print("from A") 

class B(A): 
    def foo(self): 
     super().foo() 

    def bar(self): 
     print("from B") 


A().foo() #prints "from A" 
B().foo() #prints "from B" but indirectly through the base class 
0
class A: 
    def f(self): 
     print 'a.f' 
     self.g() 

    def g(self): 
     print 'a.g' 

class B(A): 
    def g(self): 
     print 'b.g' 

b = B() 
b.f() 

# a.f 
# b.g 
Các vấn đề liên quan