使用类初始化方法的Python类常量?
我创建了一个类,可以在公共数据结构中进行比较和排序 问题是,我想为类可以接受的最大值和最小值创建两个类常量。所以我可以调用这个值,只需导入MyClass并编写使用类初始化方法的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常量。我在谷歌上没有找到太多关于常数的通用方法和属性的建议 我不需要一个机制来避免改变
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']
是中心模块对象,您可以将名称绑定到可以从那里导入的各种特定名称,或者只是对模块对象本身的引用。所以一切都会存在于记忆中。