File "C:\Users\Administrator\Documents\Mibot\oops\blinkserv.py", line 82, in __init__
    self.serv = socket(AF_INET,SOCK_STREAM)
TypeError: 'module' object is not callable

为什么我得到这个错误? 我困惑。

如何解决这个错误?


当前回答

检查导入语句,因为模块是不可调用的。 在Python中,所有东西(包括函数、方法、模块、类等)都是对象。

其他回答

在YourClassParentDir中添加到主__init__.py,例如:

from .YourClass import YourClass

然后,当你将你的类实例导入到另一个脚本时,你将有一个就绪的类实例:

from YourClassParentDir import YourClass

我知道这个线程已经有一年了,但真正的问题在您的工作目录中。

我相信工作目录是C:\Users\Administrator\Documents\Mibot\oops\。请在这个目录下检查名为socket.py的文件。一旦你找到它,重命名或移动它。导入socket时,使用当前目录中的socket.py,而不是Python目录中的socket.py。希望这对你有所帮助。:)

注意:永远不要使用Python目录中的文件名来保存程序的文件名;它将与您的程序发生冲突。

我也面临同样的问题。然后我试着不吸 导入你的类

我只是复制了YourClass.py的整个代码,并在主代码(或当前代码)上运行它。它解决了错误

当我试图在LightGBM中使用optuna(一个用于超参数调优的库)时,我遇到了这个错误。经过一个小时的挣扎,我意识到我直接导入类,这是一个问题。

import lightgbm as lgb

def LGB_Objective(trial):
        parameters = {
            'objective_type': 'regression',
            'max_depth': trial.suggest_int('max_depth', 10, 60),
            'boosting': trial.suggest_categorical('boosting', ['gbdt', 'rf', 'dart']),
            'data_sample_strategy': 'bagging',
            'num_iterations': trial.suggest_int('num_iterations', 50, 250),
            'learning_rate': trial.suggest_float('learning_rate', 0.01, 1.0),
            'reg_alpha': trial.suggest_float('reg_alpha', 0.01, 1.0), 
            'reg_lambda': trial.suggest_float('reg_lambda', 0.01, 1.0)
            }
        
        '''.....LightGBM model....''' 
        model_lgb = lgb(**parameters)
        model_lgb.fit(x_train, y_train)
        y_pred = model_lgb.predict(x_test)
        return mse(y_test, y_pred, squared=True)

study_lgb = optuna.create_study(direction='minimize', study_name='lgb_regression') 
study_lgb.optimize(LGB_Objective, n_trials=200)

这里,model_lgb = lgb(**parameters)试图调用cLass本身。 当我深入到LGB安装的site_packages文件夹中的__init__.py文件时,我确定了适合我的模块(我正在处理回归问题)。因此,我导入了lbmregressor,并用lbmregressor替换了我代码中的lgb,它开始工作了。

如果您(错误地)导入了整个类/目录或类中的目标模块,您可以检入代码。

from lightgbm import LGBMRegressor

def LGB_Objective(trial):
        parameters = {
            'objective_type': 'regression',
            'max_depth': trial.suggest_int('max_depth', 10, 60),
            'boosting': trial.suggest_categorical('boosting', ['gbdt', 'rf', 'dart']),
            'data_sample_strategy': 'bagging',
            'num_iterations': trial.suggest_int('num_iterations', 50, 250),
            'learning_rate': trial.suggest_float('learning_rate', 0.01, 1.0),
            'reg_alpha': trial.suggest_float('reg_alpha', 0.01, 1.0), 
            'reg_lambda': trial.suggest_float('reg_lambda', 0.01, 1.0)
            }
        
        '''.....LightGBM model....''' 
        model_lgb = LGBMRegressor(**parameters) #here I've changed lgb to LGBMRegressor
        model_lgb.fit(x_train, y_train)
        y_pred = model_lgb.predict(x_test)
        return mse(y_test, y_pred, squared=True)

study_lgb = optuna.create_study(direction='minimize', study_name='lgb_regression') 
study_lgb.optimize(LGB_Objective, n_trials=200)

这里有一个可能的额外边缘情况,我偶然发现并困惑了一段时间,希望它能帮助到一些人:

在some_module / a.py:

def a():
   pass

在some_module / b.py:

from . import a

def b():
   a()

在some_module / __init__ . py:

from .b import b
from .a import a

main.py:

from some_module import b

b()

然后,因为当main.py加载b时,它会通过__init__.py,它会在a.py之前尝试加载b.py。这意味着当b.py尝试加载一个对象时,它得到的是模块而不是函数——这意味着你将得到错误消息:模块对象不可调用

这里的解决方案是交换some_module/__init__.py中的顺序:

from .a import a
from .b import b

或者,如果这将创建一个循环依赖,请更改您的文件名,使其与函数不匹配,并直接从文件加载,而不是依赖__init__.py