有没有办法在Python中创建只读类属性?防爆.在Unity3d中你可以这样做:
transform.position = Vector3.zero
Run Code Online (Sandbox Code Playgroud)
Vector3.zero返回Vector3类的一个实例,其中x,y和z为0.这基本上与:
transform.position = Vector3(0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情:
class Vector3(object):
zero = Vector3(0, 0, 0)
...
Run Code Online (Sandbox Code Playgroud)
但是我得到一个未定义的变量错误,因为该类尚未定义.那么如何创建不需要类实例的只读类属性?
是否可以向模块添加属性和特殊方法?我想定义一个模块,以便导入它就像一个类实例,并且正文充当类定义.从本质上讲,这是为了避免像这样丑陋的语法:
import game
if game.Game().paused:
print("The game is paused")
Run Code Online (Sandbox Code Playgroud)
例如,游戏模块看起来像这样:
_Speed = 1
@property
def paused():
return _Speed == 0
Run Code Online (Sandbox Code Playgroud)
并使用它的文件:
import game
if game.paused:
print("The game is paused")
Run Code Online (Sandbox Code Playgroud)
另外,是否可以定义特殊方法(例如__call__)?
要清楚,我不区分类/实例方法,因为我使用的game.Game是singleton/borg类.
我已经使用@property和定义进行了测试__bool__,但都没有像我希望的那样行事.
编辑(有关我为什么要使用属性的信息):
我有一个属性game.speed,一个函数game.paused()和一个函数game.pause(bool).从本质上讲,我有一个临时变量,用于在游戏暂停时存储游戏速度.有一个私人速度变量在游戏暂停时设置为零.我从不希望用户将速度视为零,并且能够在游戏暂停时修改速度,以便在游戏恢复时使用新的速度.
我正在使用类和子类作为应用程序.对于每个类,super和sub,都有一个名为的变量类label.我希望label超类的变量默认为类名.例如:
class Super():
label = 'Super'
class Sub(Super):
label = 'Sub'
Run Code Online (Sandbox Code Playgroud)
而不是手动为每个类输出变量,是否可以从超类中的类名派生变量并自动为子类填充?
class Super():
label = # Code to get class name
class Sub(Super)
pass
# When inherited Sub.label == 'Sub'.
Run Code Online (Sandbox Code Playgroud)
原因是这将是默认行为.我也希望如果我能获得默认行为,我可以稍后通过指定备用行为来覆盖它label.
class SecondSub(Super):
label = 'Pie' # Override the default of SecondSub.label == 'SecondSub'
Run Code Online (Sandbox Code Playgroud)
我尝试过使用__name__,但这不起作用,只是给了我'__main__'.
我想label在@classmethod方法中使用类变量.所以我希望能够在不必实际创建Super()或Sub()对象的情况下引用该值,如下所示:
class Super():
label = # Magic
@classmethod
def do_something_with_label(cls):
print(cls.label)
Run Code Online (Sandbox Code Playgroud) 我编写了一个可以处理任意精度整数的类(仅用于学习目的).该类采用整数的字符串表示形式,并将其转换BigInt为进一步计算的实例.
通常你需要数字零和一,所以我认为如果课程可以返回这些将是有帮助的.我尝试了以下方法:
class BigInt():
zero = BigInt("0")
def __init__(self, value):
####yada-yada####
Run Code Online (Sandbox Code Playgroud)
这不起作用.错误:"名称'BigInt'未定义"
然后我尝试了以下内容:
class BigInt():
__zero = None
@staticmethod
def zero():
if BigInt.__zero is None:
BigInt.__zero = BigInt('0')
return BigInt.__zero
def __init__(self, value):
####yada-yada####
Run Code Online (Sandbox Code Playgroud)
这实际上非常有效.我不喜欢的是,这zero是一种方法(因此必须被调用BigInt.zero()),这是违反直觉的,因为它应该只引用固定值.
所以我尝试改变zero成为一个属性,但然后写入BigInt.zero返回该类的实例property而不是BigInt因为使用了装饰器.由于类型错误,该实例不能用于计算.
有没有解决这个问题的方法?