Nếu bạn không muốn tự lăn, có một chức năng có sẵn trong pydoc
mô-đun thực hiện chính xác điều này:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
Ưu điểm của phương pháp này so với các phương pháp khác được liệt kê ở đây là locate
sẽ tìm thấy bất kỳ đối tượng python nào tại đường dẫn chấm được cung cấp, không chỉ là một đối tượng trực tiếp trong một mô-đun. ví dụ my_package.my_module.MyClass.attr
.
Nếu bạn tò mò công thức của họ là gì, thì đây là chức năng:
def locate(path, forceload=0):
"""Locate an object by name or dotted path, importing as necessary."""
parts = [part for part in split(path, '.') if part]
module, n = None, 0
while n < len(parts):
nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
if nextmodule: module, n = nextmodule, n + 1
else: break
if module:
object = module
else:
object = __builtin__
for part in parts[n:]:
try:
object = getattr(object, part)
except AttributeError:
return None
return object
Nó dựa vào pydoc.safeimport
chức năng. Dưới đây là các tài liệu cho rằng:
"""Import a module; handle errors; return None if the module isn't found.
If the module *is* found but an exception occurs, it's wrapped in an
ErrorDuringImport exception and reraised. Unlike __import__, if a
package path is specified, the module at the end of the path is returned,
not the package at the beginning. If the optional 'forceload' argument
is 1, we reload the module from disk (unless it's a dynamic extension)."""