Python“静态核心类”

2024-06-16 16:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在制作一个游戏服务器,实际上我想用Python为我的所有服务器产品制作一个基础项目。我以前用C#但是我想做一些不同的事情,所以我开始使用Python。虽然我不知道怎么做。你知道吗

在C#中,我曾经创建一个静态“核心”类来保存所有数据,包含入口点,然后在那里引导服务器。下面是一个小例子:

using System;

namespace SERVER 
{
    public static class Engine
    {
        public static DatabaseHelper DatabaseHelper { get; private set; }

        static void Main(string[] args)
        {
            DatabaseHelper = new DatabaseHelper();
        }
    }
}

然后我就可以在每节课上使用:

Engine.DatabaseHelper.SomeMethod();

现在,我想在我的Python项目中使用相同的概念,但我不知道如何做到这一点。你知道吗

我先得到这个:

你知道吗动态mu.py你知道吗

import Engine

engine = Engine.Engine()

你知道吗引擎.py你知道吗

from Network.Game.GameConnectionListener import GameConnectionListener


class Engine:
    gameConnection = None

    def __init__(self):
        gameConnection = GameConnectionListener()

    def tuple_to_addr(self, tpl):
        return '{0}:{1}'.format(tpl[0], str(tpl[1]))

然后在我的Ga里meConnectionListener.py连接我会用:

import DynamicEmu

为了做

DynamicEmu.engine.tuple_to_addr(TUPLE HERE)

但我有个错误

Traceback (most recent call last):
  File "C:/Users/Josh/PycharmProjects/DynamicEmu/DynamicEmu.py", line 1, in <module>
    import Engine
  File "C:\Users\Josh\PycharmProjects\DynamicEmu\Engine.py", line 3, in <module>
    from Network.Game.GameConnectionListener import GameConnectionListener
  File "C:\Users\Josh\PycharmProjects\DynamicEmu\Network\Game\GameConnectionListener.py", line 4, in <module>
    import DynamicEmu
  File "C:\Users\Josh\PycharmProjects\DynamicEmu\DynamicEmu.py", line 3, in <module>
    engine = Engine.Engine()
AttributeError: module 'Engine' has no attribute 'Engine'

我很喜欢Python,所以如果我做了一些非常错误的事情,我理解,我想学习,所以我会感激我能得到的每一个帮助:)


Tags: inpyimport服务器linestaticusersengine
1条回答
网友
1楼 · 发布于 2024-06-16 16:18:46

典型的Python代码不太使用静态成员。1因此我建议将大多数变量设置为实例变量。例如,在DynamicEmu.py中,没有模块级的Engine实例。相反,应该有一个用Engine实例初始化的类

class DynamicEmu:
    def __init__(self, engine):
        self.engine = engine
    ...

或接受Engine实例作为参数的函数

def dynamic_emu(engine):
    ...

如果不知道DynamicEmu.py中的代码应该做什么,就很难更具体。你知道吗

类似地,在GameConnectionListener.py中,您可以像

class GameConnectionListener:
    def __init__(self, engine):
        self.engine = engine
    ...

其他代码也是如此。(请记住,Python函数是对象,可以作为参数传递并用作回调。考虑一下你是否可以通过一个函数而不是一个类逃脱惩罚。)

显然,必须在某个地方创建Engine实例。逻辑位置可能在main()函数中,或者在程序早期调用的某个设置函数中。然后可以根据需要将其传递给其他函数和方法。你知道吗

根据我的经验,当你清楚代码不同部分之间的依赖关系时,编写一个大型项目往往效果最好。例如,明确游戏引擎是使用监听器还是监听器使用游戏引擎。如果引擎使用侦听器,那么您应该在Engine中使用GameConnectionListener,而不是反之亦然。GameConnectionListener的设计应该使它不知道Engine。当然,这并不总是可能的,但无论你能做到什么程度,我认为这都是有帮助的。它减少或消除了示例代码中的循环依赖关系,还可以帮助您分别编写程序的每个组件,而不必同时担心其他组件。你知道吗


1或者C#所称的静态成员;在Python中,它们被称为类成员,但模块级变量通常提供几乎相同的功能,这些变量更简单。你知道吗

相关问题 更多 >