Cách tốt nhất trong Python để bắt chước các hàm ảo ảo và thuần túy như trong C# là gì?Chức năng ảo Mimic (thuần) ảo như C#
Hiện nay tôi sử dụng một sơ đồ như:
class AbstractClass(object):
'''Abstract class'''
def __init__(self):
assert False, 'Class cannot be instantiated'
def _virtual_init(self):
print 'Base "constructor"'
def pure_virtual_function(self):
assert False, 'Pure virtual function should be derived'
def virtual_function(self):
print 'Base: virtual function'
class Derived1(AbstractClass):
'''All functions derived'''
def __init__(self):
print 'Derived1: constructor'
AbstractClass._virtual_init(self)
def pure_virtual_function(self):
print 'Derived1: pure virtual function'
def virtual_function(self):
print 'Derived1: virtual function'
class Derived2(AbstractClass):
'''Pure virtual method missing.'''
def __init__(self):
print 'Derived2: constructor'
AbstractClass._virtual_init(self)
def virtual_function(self):
print 'Derived3: virtual function'
class Derived3(AbstractClass):
'''Virtual method missing (use base class)'''
def __init__(self):
print 'Derived3: constructor'
AbstractClass._virtual_init(self)
def pure_virtual_function(self):
print 'Derived3: pure virtual function'
# ab = AbstractClass() # Gives error -> OK
print 'DERIVED 1'
dv1 = Derived1()
dv1.pure_virtual_function()
dv1.virtual_function()
print 'DERIVED 2'
dv2 = Derived2()
# dv2.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK
dv2.virtual_function()
print 'DERIVED 3'
dv3 = Derived3()
# dv3.pure_virtual_function() # Gives error: Pure virtual function should be derived -> OK
dv3.virtual_function()
tôi nhận được như đầu ra:
DERIVED 1
Derived1: constructor
Base "constructor"
Derived1: pure virtual function
Derived1: virtual function
DERIVED 2
Derived2: constructor
Base "constructor"
Derived3: virtual function
DERIVED 3
Derived3: constructor
Base "constructor"
Derived3: pure virtual function
Base: virtual function
Tuy nhiên câu hỏi cụ thể của tôi là:
- Có một cách thanh lịch hơn để xác định một lớp cơ sở trừu tượng trong Python (2.7)? Giải pháp trên chỉ đưa ra một lỗi tại thời gian chạy (không phải ví dụ với pylint) Không có từ khoá 'trừu tượng' trong Python afaik.
- Có cách nào thanh lịch hơn để xác định phương pháp ảo thuần túy bằng Python (2.7) không? Một lần nữa, giải pháp trên chỉ đưa ra lỗi khi chạy.
- Có cách nào thanh lịch hơn để xác định phương thức ảo bằng Python (2.7) không? Không cần kiểm tra, nhưng không có từ khóa nào giống như 'ảo' trong Python afaik.
Xin cảm ơn trước.
Tôi không hoàn toàn quen thuộc với các mẫu thiết kế này ... Nhưng việc đọc mã này nhắc tôi về mô-đun 'abc'. Bạn có thể muốn có một cái nhìn ở đó và xem nó cung cấp các chức năng mà bạn đang tìm kiếm. – mgilson
Bạn sẽ không bao giờ gặp nhiều hơn lỗi thời gian chạy. Không có kiểm tra thời gian biên dịch để nói về, ngoài tính hợp lệ của cú pháp.(Mặc dù bạn có thể cố gắng * dạy * pylint để thực hiện các kiểm tra như vậy cho bạn.) Tốt hơn, ** quên ** về tất cả những công cụ thiết kế gọn gàng đó. Cứ làm đi. Xác định một vài lớp với giao diện tương thích nhưng không có kế thừa, vượt qua các trường hợp xung quanh, vv mà không cố gắng để có được máy tính để thực thi các bất biến như vậy. Dường như bạn đang suy nghĩ trong C#/Java. Điều đó dẫn đến kết quả đầu ra khủng khiếp của Python, giống như một tư duy Python sẽ tạo ra mã C#/Java khủng khiếp. – delnan
Tại sao bạn làm điều này? Mỗi ngôn ngữ đều có cách làm riêng. Bạn không cần điều này trong python. – Lanaru