Tôi có một lớp siêu với một phương thức gọi các phương thức khác chỉ được định nghĩa trong các lớp con của nó. Đó là lý do tại sao, khi tôi tạo một thể hiện của lớp siêu của tôi và gọi phương thức của nó, nó không thể tìm ra phương thức và đưa ra một lỗi.Ngăn chặn một lớp từ instantiation trực tiếp trong Python
Dưới đây là một ví dụ:
class SuperClass(object):
def method_one(self):
value = self.subclass_method()
print value
class SubClassOne(SuperClass):
def subclass_method(self):
return 'subclass 1'
class SubClassTwo(SuperClass):
def subclass_method(self):
return 'nubclass 2'
s1 = SubClassOne()
s1.method_one()
s2 = SubClassTwo()
s2.method_one()
c = SuperClass()
c.method_one()
# Results:
# subclass 1
# nubclass 2
# Traceback (most recent call last):
# File "abst.py", line 28, in <module>
# c.method_one()
# File "abst.py", line 4, in method_one
# value = self.subclass_method()
# AttributeError: 'SuperClass' object has no attribute 'subclass_method'
Tôi đã suy nghĩ về việc thay đổi init của siêu lớp và xác minh các loại đối tượng, khi một trường hợp mới được tạo ra. Nếu đối tượng thuộc về super class thì sẽ gây ra lỗi. Tuy nhiên, tôi không chắc chắn nếu đó là cách Pythonic làm việc đó.
Bất kỳ đề xuất nào?
Cách Pythonic là viết tài liệu hay giải thích cách sử dụng lớp học của bạn. – yak
@chown: Điều này thực sự được thực hiện khá thường xuyên trong C++. Những gì anh ta làm là cơ bản gọi các phương thức ảo. Không có gì sai với họ, nếu họ là giải pháp thích hợp cho vấn đề. – rossipedia
Tôi sẽ đồng ý rằng nó không phải là rất Pythonic – rossipedia