相关疑难解决方法(0)

python只读类属性

有没有办法在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)

但是我得到一个未定义的变量错误,因为该类尚未定义.那么如何创建不需要类实例的只读类属性?

python properties

7
推荐指数
3
解决办法
3011
查看次数

模块可以有属性吗?

是否可以向模块添加属性和特殊方法?我想定义一个模块,以便导入它就像一个类实例,并且正文充当类定义.从本质上讲,这是为了避免像这样丑陋的语法:

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).从本质上讲,我有一个临时变量,用于在游戏暂停时存储游戏速度.有一个私人速度变量在游戏暂停时设置为零.我从不希望用户将速度视为零,并且能够在游戏暂停时修改速度,以便在游戏恢复时使用新的速度.

python module properties

6
推荐指数
1
解决办法
4051
查看次数

Python类名作为类变量

我正在使用类和子类作为应用程序.对于每个类,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)

python class-variables python-3.x

2
推荐指数
3
解决办法
1781
查看次数

如何创建一个返回类本身实例的静态类属性?

我编写了一个可以处理任意精度整数的类(仅用于学习目的).该类采用整数的字符串表示形式,并将其转换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因为使用了装饰器.由于类型错误,该实例不能用于计算.

有没有解决这个问题的方法?

python oop properties

2
推荐指数
1
解决办法
87
查看次数

标签 统计

python ×4

properties ×3

class-variables ×1

module ×1

oop ×1

python-3.x ×1