Tôi có một số lớp học Python rằng, nếu đơn giản, giống như sau:Python - đánh máy OK khi lỗi sẽ không được ném khác?
class base:
def __init__(self, v):
self.value = v
def doThings(self):
print "Doing things."
def doMoreThings(self):
print "Doing more things."
def combine(self, b):
self.value += b.value
class foo(base):
def showValue(self):
print "foo value is %d." % self.value
class bar(base):
def showValue(self):
print "bar value is %d." % self.value
Lớp base
chứa phương pháp (đại diện trên bởi doThings
và doMoreThings
) mà thực hiện chức năng chung cho cả foo
và bar
lớp con. Các lớp con foo
và bar
khác nhau về cơ bản trong cách chúng diễn giải trường value
. (Ở trên, chúng chỉ khác với những gì chúng hiển thị khi in, nhưng trong ứng dụng thực tế của chúng tôi, chúng làm nhiều thứ phức tạp hơn.) base
có thể được coi là "trừu tượng": người dùng chỉ làm việc với foo
s và bar
S. base
chỉ tồn tại như một ngôi nhà cho mã chung cho các lớp con của nó.
Phương pháp tôi muốn hỏi là combine
, cho phép bạn lấy hai trong số các đối tượng này và tạo một đối tượng thứ ba. Bởi vì foo
và bar
giải thích value
cách khác nhau, nó không có ý nghĩa để combine
hai lớp con của các loại khác nhau: bạn có thể combine
hai foo
s để có được một foo
hoặc hai bar
s để có được một bar
nhưng không phải là một foo
và bar
. Mặc dù vậy, thủ tục cho combine
là cùng một số cho tất cả các lớp con, do đó, điều này có ý nghĩa khi được xác định và xác định ở một nơi.
Tôi có thể muốn báo hiệu lỗi nếu người dùng cố gắng combine
hai đối tượng không tương thích, nhưng tôi không thấy cách để làm điều này mà không đưa vào các lỗi đánh máy xấu xí. Có thực hành tốt để làm điều này? Hoặc tôi nên làm điều bình thường và không kiểm tra, ghi lại vấn đề và giả sử rằng người dùng sẽ không cố gắng sử dụng combine
theo cách không được dự định, mặc dù việc sử dụng đó có vẻ như "thành công" và trả lại rác đối tượng thay vì tăng lỗi?
Cảm ơn sự giúp đỡ của bạn.
So sánh '__class __.__ name__' là IMHO rất xấu xí. Một cách tốt hơn là so sánh 'loại (tự) == loại (b)' hoặc sử dụng 'isinstance (b, type (self))'. – glglgl
@glglgl '' type (self) == type (b) '' luôn đúng vì cả hai đều là '' instance''. '' isinstance'' có cùng một vấn đề. Đồng ý điều đó thật xấu xí nhưng ... – Vorsprung
Ouch! Không thấy OP sử dụng các lớp học kiểu cũ ... sau đó nó rõ ràng. (Tôi cố gắng tránh chúng bất cứ khi nào có thể.) Nhưng với 'isinstance', nó cũng nên làm việc với các lớp kiểu cũ (chỉ cần kiểm tra). – glglgl