Trong C++, bạn có thể vô hiệu hóa một hàm trong lớp của cha mẹ bằng cách khai báo nó là riêng tư trong lớp con. Làm thế nào điều này có thể được thực hiện bằng Python? I E. Làm cách nào để ẩn chức năng của cha mẹ khỏi giao diện công khai của trẻ?Thừa kế Python - cách vô hiệu hóa chức năng
Trả lời
Có thực sự không có bất kỳ sự thật "private" thuộc tính hoặc các phương pháp trong Python . Một điều bạn có thể làm chỉ đơn giản là ghi đè lên các phương pháp mà bạn không muốn trong lớp con, và nâng cao một ngoại lệ: Phương pháp
>>> class Foo(object):
... def foo(self):
... print 'FOO!'
...
>>> class Bar(Foo):
... def foo(self):
... raise AttributeError("'Bar' object has no attribute 'foo'")
...
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<interactive input>", line 3, in foo
AttributeError: 'Bar' object has no attribute 'foo'
class X(object):
def some_function(self):
do_some_stuff()
class Y(object):
some_function = None
Điều này có thể dẫn đến một số khó chịu và khó có thể tìm thấy trường hợp ngoại lệ được ném mặc dù, vì vậy bạn có thể thử này:
class X(object):
def some_function(self):
do_some_stuff()
class Y(object):
def some_function(self):
raise NotImplementedError("function some_function not implemented")
kurosch của việc giải quyết vấn đề không phải là khá đúng, vì bạn vẫn có thể sử dụng mà không cần b.foo
nhận được AttributeError
. Nếu bạn không gọi hàm, không có lỗi xảy ra. Dưới đây là hai cách mà tôi có thể nghĩ để làm điều này:
import doctest
class Foo(object):
"""
>>> Foo().foo()
foo
"""
def foo(self): print 'foo'
def fu(self): print 'fu'
class Bar(object):
"""
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
...
AttributeError
>>> hasattr(b, 'foo')
False
>>> hasattr(b, 'fu')
True
"""
def __init__(self): self._wrapped = Foo()
def __getattr__(self, attr_name):
if attr_name == 'foo': raise AttributeError
return getattr(self._wrapped, attr_name)
class Baz(Foo):
"""
>>> b = Baz()
>>> b.foo() # doctest: +ELLIPSIS
Traceback (most recent call last):
...
AttributeError...
>>> hasattr(b, 'foo')
False
>>> hasattr(b, 'fu')
True
"""
foo = property()
if __name__ == '__main__':
doctest.testmod()
Thanh sử dụng mẫu "bọc" để hạn chế quyền truy cập vào đối tượng được bao bọc. Martelli has a good talk giải quyết vấn đề này. Baz sử dụng the property built-in để triển khai giao thức mô tả cho thuộc tính ghi đè.
Vâng, chắc chắn, trong câu trả lời của tôi nó vẫn còn "nhìn thấy", nhưng bạn không thể "sử dụng" nó cho mỗi người vì nó sẽ làm tăng ngoại lệ. Một điểm hợp lệ, mặc dù. – kurosch
+1, một mẹo thông minh để sử dụng thuộc tính "trống" để "xóa" phương thức foo! : D – MestreLion
Điều này sẽ phá vỡ lớp để sử dụng toán tử được xác định trên cấp độ gốc vì không có lớp con. Ngoài ra '__getattr__' là chậm – JBernardo
Đây là cách sạch nhất mà tôi biết để làm điều đó.
Ghi đè các phương thức và yêu cầu mỗi phương thức ghi đè gọi phương thức disabledmethods() của bạn. Như thế này:
class Deck(list):
...
@staticmethod
def disabledmethods():
raise Exception('Function Disabled')
def pop(self): Deck.disabledmethods()
def sort(self): Deck.disabledmethods()
def reverse(self): Deck.disabledmethods()
def __setitem__(self, loc, val): Deck.disabledmethods()
Một biến thể của câu trả lời của kurosch:
class Foo(object):
def foo(self):
print 'FOO!'
class Bar(Foo):
@property
def foo(self):
raise AttributeError("'Bar' object has no attribute 'foo'")
b = Bar()
b.foo
Điều này đặt ra một AttributeError
trên tài sản thay vì khi phương pháp này được gọi.
Tôi đã đề xuất nó trong nhận xét nhưng tiếc là chưa có danh tiếng cho nó.
Điều này có làm tăng AttributeError nếu bạn gọi 'getattr (b," Foo ")'? Thật không may, tôi không có một thông dịch viên Python ở đây để kiểm tra nó. –
nếu bạn có nghĩa là 'getattr (b, 'foo')' thì có nó sẽ –
Vâng, đó là ý của tôi. Mặc dù 'getattr (b, 'Foo')' cũng sẽ cung cấp cho bạn một lỗi thuộc tính, do đó, không phải lo lắng ở đó! –
- 1. Thừa kế chức năng ảo
- 2. quá tải chức năng và thừa kế
- 3. Vô hiệu hóa kế thừa quy tắc "Cho phép tất cả người dùng" từ IIS 7
- 4. Vô hiệu hóa các nosetests Python
- 5. Con trỏ chức năng thành viên và thừa kế
- 6. QT - Cách vô hiệu hóa Nút ấn
- 7. C++ nhiều chức năng thừa kế sáp nhập
- 8. C++ thừa kế và chức năng ghi đè
- 9. Overhead của kế thừa C++ không có chức năng ảo
- 10. Nhiều thừa kế và tinh khiết chức năng ảo
- 11. Tín hiệu Qt & câu hỏi thừa kế
- 12. Chức năng cơ sở cuộc gọi sau đó được thừa kế chức năng
- 13. Thừa kế và chức năng nhà máy trong Python và Django
- 14. Python Nhiều thừa kế
- 15. Python đa chức năng thừa kế ghi đè và ListView trong django
- 16. CKEditor với CKFinder - vô hiệu hóa FileBrowser, Giữ chức năng Tải lên
- 17. Thừa kế tài liệu trong kế thừa lớp Python
- 18. Vô hiệu hóa UISearchBar
- 19. áp dụng các chức năng python trực tiếp cho thiết kế Qt làm tín hiệu
- 20. Vô hiệu hóa 'ctrl + s' của trình duyệt mặc định chức năng
- 21. Vô hiệu hóa vĩnh viễn AutoEventWireup
- 22. Chức năng mã hóa Caesar trong Python
- 23. Thừa kế lớp trong Python
- 24. vô hiệu hóa hoặc khóa chuột và keybord trong python?
- 25. Cách vô hiệu hóa đệm đầu ra trong Process.StandardOutput
- 26. Làm thế nào để vô hiệu hóa cảnh báo python
- 27. Whats sự khác biệt giữa prop ('vô hiệu hóa', 'vô hiệu hóa') và chống đỡ ('vô hiệu hóa', đúng)
- 28. Cách ẩn/vô hiệu hóa admob adview?
- 29. RichFaces 4 - cách vô hiệu hóa skin
- 30. git cách vô hiệu hóa push
> Thực sự không có bất kỳ thuộc tính hoặc phương thức "riêng tư" thực sự nào trong Python. Đó là lý do tại sao tôi không hỏi cách đặt chúng ở chế độ riêng tư, nhưng cách 'xóa' chúng khỏi giao diện. Hy vọng rằng phiên bản đã chỉnh sửa chính xác hơn –
Tôi đồng ý rằng NotImplementedError có lẽ là cách tốt nhất để sử dụng, nhưng nếu bạn thực sự muốn không phù hợp với phương pháp kế thừa, hãy nâng AttributeError (đó là những gì bạn sẽ nhận được nếu phương thức không tồn tại). –
Điểm tốt về AttributeError. Tôi sẽ cập nhật ví dụ của mình. – kurosch