Nếu bạn không muốn cuộn của riêng bạn, có một chức năng có sẵn trong các mô-đun pydoc
thực hiện chính xác này:
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
Lợi thế của cách tiếp cận 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 ở đường chấm chấm được cung cấp, chứ không phải j ust 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ò những gì công thức của họ là, đâ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à những 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)."""
tôi cần để có thể gán lớp tham chiếu đến một biến là tốt. – pjesi
Điều này có vẻ là một bản sao của: http://stackoverflow.com/questions/452969/does-python-have-an-equivalent-to-java-class-forname – cdleary
Bạn nói đúng là một bản sao, cảm ơn vì đã tìm kiếm nó – pjesi