Giả sử bạn có một module cũ gọi mod
mà bạn sử dụng như thế này:
import mod
obj = mod.Object()
obj.method()
mod.function()
# and so on...
Và bạn muốn mở rộng nó, mà không cần thay thế nó cho người dùng của bạn. Dễ dàng thực hiện. Bạn có thể đặt cho mô-đun mới của mình một tên khác, newmod.py
hoặc đặt tên mô-đun đó theo cùng một đường dẫn sâu hơn và giữ cùng tên, ví dụ: /path/to/mod.py
. Sau đó, người dùng của bạn có thể nhập nó bằng một trong các cách sau:
import newmod as mod # e.g. import unittest2 as unittest idiom from Python 2.6
hoặc
from path.to import mod # useful in a large code-base
Trong mô-đun của bạn, bạn sẽ muốn làm cho tất cả các tên tuổi sẵn:
from mod import *
hoặc đặt tên rõ ràng cho mỗi tên bạn nhập:
from mod import Object, function, name2, name3, name4, name5, name6, name7, name8, name9, name10, name11, name12, name13, name14, name15, name16, name17, name18, name19, name20, name21, name22, name23, name24, name25, name26, name27, name28, name29, name30, name31, name32, name33, name34, name35, name36, name37, name38, name39
Tôi nghĩ rằng import *
sẽ dễ bảo trì hơn cho trường hợp sử dụng này - nếu mô-đun cơ sở mở rộng chức năng, bạn sẽ liên tục theo kịp (mặc dù bạn có thể tô sáng các đối tượng mới có cùng tên).
Nếu mod
bạn đang mở rộng có phong nha __all__
, nó sẽ hạn chế các tên được nhập.
Bạn cũng nên khai báo một số __all__
và mở rộng nó bằng mô-đun mở rộng __all__
.
import mod
__all__ = ['NewObject', 'newfunction']
__all__ += mod.__all__
# if it doesn't have an __all__, maybe it's not good enough to extend
# but it could be relying on the convention of import * not importing
# names prefixed with underscores, (_like _this)
Sau đó, mở rộng đối tượng và chức năng như bình thường.
class NewObject(object):
def newmethod(self):
"""this method extends Object"""
def newfunction():
"""this function builds on mod's functionality"""
Nếu các đối tượng mới cung cấp chức năng bạn có ý định thay thế (hoặc có lẽ bạn đang backporting các chức năng mới vào một cơ sở mã cũ), bạn có thể ghi đè lên tên
Bạn phải tự hỏi mình những gì nó là bạn cố gắng thực hiện điều đó không thể được giải quyết cho bạn bằng cách phân lớp chức năng từ mô-đun hiện có. – jathanism
Chủ đề thú vị trên nhóm tin tức Python về những gì tôi ban đầu đã tìm kiếm đã dẫn tôi đến phần Hỏi & Đáp này, chủ đề từ giống như, 13 năm trở lại: https://mail.python.org/pipermail/python-dev/2002-June /024839.html –