【问题标题】:Python equivalent of Perl's `$AUTOLOAD`Python 等效于 Perl 的 `$AUTOLOAD`
【发布时间】:2020-07-01 16:14:31
【问题描述】:

正如标题所说,有没有相当于Perl的$AUTOLOAD的函数?

use strict; 
use warnings; 
use vars '$AUTOLOAD'; 


sample_function('7','11'); 


# AUTOLOAD() Function 
sub AUTOLOAD 
{ 
    print "AUTOLOAD is set to $AUTOLOAD\n"; 
    print "With arguments ", "@_\n"; 
} 

输出:

AUTOLOAD is set to main::sample_function
With arguments 7 11

在 Python 中有这样的实现吗?

【问题讨论】:

  • 对于那些想知道的人,Perl 的AUTOLOAD 是在类/对象上调用不存在的方法时调用的方法。例如,如果$foo 指定的类或$foo 指定的对象的类没有名为bar 的方法,并且如果它有名为AUTOLOAD 的方法,则$foo->bar 调用$foo->AUTOLOAD

标签: python-3.x


【解决方案1】:

这真的取决于你想要达到的目标。例如,对于自动加载丢失的包,您可以执行类似于 page

的操作
   import os.path 
   try:   
     import some_module 
   except ImportError:   
     import pip 
     pip.main(['install', '--user', 'some_module'])
     os.execv(__file__,sys.argv)

如果您想动态加载某些内容,您可以使用__init__.py 文件和以下代码(我在一些旧脚本中使用它来加载演说家迁移模式文件)。不过你需要import * from <whatever_folder_has_this_init_file>:

import importlib
import inspect
import glob
from os.path import dirname, basename, isfile, join

def __get_defined_modules():
    modules_path = join(dirname(__file__), "migrations", "*.py")
    modules = glob.glob(modules_path)
    for f in modules:
        if isfile(f) and f.find('migration'):
            yield basename(f)[:-3]

def run_migrations(db):
    m = __get_defined_modules()
    for x in m:
        if x.find('migration') > -1:
            module_path='{}.migrations.{}'.format(basename(dirname(__file__)), x)
            for _, cls in inspect.getmembers(importlib.import_module(module_path), inspect.isclass):
                if cls.__module__ == module_path:
                    print("Loading and executing {}: {}".format(x, cls))
                    migration = cls()
                    migration.set_connection(db)
                    migration.up()

__all__ = list(__get_defined_modules()) + ['run_migrations']

另一种方式(我并不真正推荐)是使用这种方式(我没有测试过):

import inspect, importlib def try_xx()
    try:
        some_xx()
    except NameError as e:
        func_name = e.split("'")[1]
        parts = func_name.split("_")
        for _, f in inspect.getmembers(importlib.import_module("/module/path/{}.py".format(parts[1])), inspect.isfunction):
            if f.__name__ == func_name:
                f()

但是要回答您的问题...不,python 没有内置的自动加载机制,因为大多数时候您都不需要它。您可以在此处阅读有关原因的详细说明:Python modules autoloader?(关于 php,它也具有自动加载功能,但您会明白的)

【讨论】:

  • 谢谢@user1452962。
  • 答案和链接是关于自动加载模块的,但是 Perl 的 AUTOLOAD 是在类/对象上调用不存在的方法时调用的方法。例如,如果$foo 指定的类或$foo 指定的对象的类没有名为bar 的方法,并且如果它有名为AUTOLOAD 的方法,则$foo->bar 调用$foo->AUTOLOAD
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 2013-05-12
  • 2011-11-13
  • 2011-03-13
  • 1970-01-01
  • 2014-11-06
  • 2014-09-29
  • 2014-06-15
相关资源
最近更新 更多