Helpex - Trao đổi & giúp đỡ Đăng nhập
4

Làm cách nào để truy cập các biến cục bộ của một phương thức siêu lớp trong một phương thức được ghi đè trong lớp con?

class Foo(object):
    def foo_method(self):
        x = 3

class Bar(Foo):
    def foo_method(self):
        super().foo_method()
        print(x) # Is there a way to access x, besides making x an attribute of the class?

Đoạn mã dưới đây cung cấp một NameError: name 'x' is not defined

bar = Bar()
bar.foo_method()

Điều này không có gì đáng ngạc nhiên và nó có thể được khắc phục bằng cách tạo xmột thuộc tính instance, nhưng có thể xđược truy cập nguyên dạng Bar.foo_methodtrực tiếp hơn không?

4 hữu ích 3 bình luận 2.1k xem chia sẻ
6

Tóm lược

Q. ... có thể truy cập x như hiện tại trong Bar.foo_method trực tiếp hơn không?

Như đã viết, câu trả lời là không .

Vào thời điểm super().foo_method()trả về, khung ngăn xếp cho phương thức đó đã được gói lại và các biến cục bộ biến mất. Không có gì để truy cập.

Giải pháp thay thế: câu lệnh trả về

Giải pháp đơn giản nhất để chia sẻ dữ liệu là foo_methodtrả về x :

class Foo(object):
    def foo_method(self):
        x = 3
        return x

class Bar(Foo):
    def foo_method(self):
        x = super().foo_method()
        print(x)

Giải pháp thay thế: phạm vi động

Nếu bạn đang tìm kiếm thứ gì đó giống với phạm vi động , giải pháp đơn giản nhất là chuyển vào không gian tên được chia sẻ:

class Foo(object):
    def foo_method(self, ns):
        x = 3
        ns['x'] = 3

class Bar(Foo):
    def foo_method(self):
        ns = {}
        super().foo_method(ns)
        x = ns['x']
        print(x)

Nếu bạn muốn mô phỏng phạm vi động trong các cuộc gọi lồng nhau, hãy xem xét sử dụng collection.ChainMap () .

6 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x scope namespaces stack-frame , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading