Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用类初始化方法的Python类常量?_Python_Python 3.x_Oop_Constants_Class Constants - Fatal编程技术网

使用类初始化方法的Python类常量?

使用类初始化方法的Python类常量?,python,python-3.x,oop,constants,class-constants,Python,Python 3.x,Oop,Constants,Class Constants,我创建了一个类,可以在公共数据结构中进行比较和排序 问题是,我想为类可以接受的最大值和最小值创建两个类常量。所以我可以调用这个值,只需导入MyClass并编写 obj = MyClass.MY_MAX_CONSTANT 问题是,不允许调用构造函数或init方法来初始化这些常量 在Java中,这将被声明为静态的,并且可以工作,但是我不知道如何使用构造函数/init方法在Python中实现class/static常量。我在谷歌上没有找到太多关于常数的通用方法和属性的建议 我不需要一个机制来避免改变

我创建了一个类,可以在公共数据结构中进行比较和排序

问题是,我想为类可以接受的最大值和最小值创建两个类常量。所以我可以调用这个值,只需导入MyClass并编写

obj = MyClass.MY_MAX_CONSTANT

问题是,不允许调用构造函数或init方法来初始化这些常量

在Java中,这将被声明为静态的,并且可以工作,但是我不知道如何使用构造函数/init方法在Python中实现class/static常量。我在谷歌上没有找到太多关于常数的通用方法和属性的建议

我不需要一个机制来避免改变常量值,因为我绝对不会改变它

我的第一次尝试是:

class MyClass(object):
    MY_MAX_CONSTANT = MyClass(10,10)
    MY_MIN_CONSTANT = MyClass(0,0)

    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
        # We imagine some initialization work here
        self.x = param1
        self.y = param2


    # SORT FUNCTIONS
    def __cmp__(self, other):
        # Implementation already made here

    def __eq__(self, other):
        # Implementation already made here

    def __ne__(self, other):
        # Implementation already made here

    def __ge__(self, other):
        # Implementation already made here

    # And so on...
第二次尝试,对每个常量使用一些函数:

class MyClass(object):
    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
        # We imagine some initialization work here
        self.x = param1
        self.y = param2
        MY_MAX_CONSTANT = None
        MY_MIN_CONSTANT = None

    @staticmethod
    def get_max(self):
        if not MyClass.MY_MAX_CONSTANT:
            MyClass.MY_MAX_CONSTANT = MyClass(10,10)
        return MyClass.MY_MAX_CONSTANT

    @staticmethod
    def get_min(self):
        if not MyClass.MY_MIN_CONSTANT:
            MyClass.MY_MIN_CONSTANT = MyClass(0,0)
        return MyClass.MY_MIN_CONSTANT    

    # SORT FUNCTIONS (I'm not writing them twice for spacing)
但我想避免只用于生成两个常量的奇怪函数机制

我更喜欢在课堂上保持不变,而不是模块,因为这对我来说更自然,但我听到了任何建议或建议。有谁能给我一个更好的pythonic解决方案吗


谢谢

添加常量创建类后,您可以添加更多类属性:

class MyClass:
    # ...

MyClass.MY_MAX_CONSTANT = MyClass(10, 10)
MyClass.MY_MIN_CONSTANT = MyClass(0, 0)

只有当
class
语句完成运行时,class对象才可用,并绑定到名称
MyClass
。在此之前不能创建实例。

“问题是不允许调用构造函数或init方法来初始化这些常量。”-谁不允许?你的老师?Python允许这样做,但是一旦类实际存在,您就必须创建常量——它在类语句体中还不存在。我应该在哪里定义常量?在我看来,init不是一个递归调用自己的好地方。谢谢。这很有效。我现在唯一的疑问是导入类时导入语句是如何工作的。它从正确的模块中带来了所有与MyClass相关的东西?Python如何知道何时停止导入?我怎么知道?(直到我知道我认为导入类只导入声明下的缩进内容)导入将第一次执行模块中的所有顶级代码。其余的只是将名称绑定到对象
sys.modules['modulename']
是中心模块对象,您可以将名称绑定到可以从那里导入的各种特定名称,或者只是对模块对象本身的引用。所以一切都会存在于记忆中。