在Python中從靜態初始化程序中訪問對象

2024-04-25 20:07:09 发布

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

这是我之前的一个查询Static initializer in Python的结果 我试图从它的一个属性中找到一个对象,就像在java中使用静态构造函数一样:

public class TestBuilder {
private String uid;
private String name;
private double speed;
private static ArrayList<TestBuilder> types = new ArrayList<TestBuilder>();
public static final TestBuilder SLEEPY;
public static final TestBuilder SPEEDY;

static {
    SLEEPY = new TestBuilder("1", "slow test", 500.00);
    SPEEDY = new TestBuilder("2", "fast test", 2000.00);
}

private TestBuilder(String uid, String name, double speed){
    this.uid = uid;
    this.name = name;
    this.speed = speed;
    types.add(this);
}

public static TestBuilder getBuilderFromName(String s){
    for (int i = 0; i < types.size(); i++){
        if (((TestBuilder) types.get(i)).name.equals(s)){
            return (TestBuilder) types.get(i);
        }
    }
    return null;
}

在python中,我尝试过:

class TestBuilder:
    uid = str()
    name = str()
    speed = float()
    types = []

    def __init__(self, uid, name, speed):
        self.uid = uid
        self.name = name
        self.speed = speed
        self.types.append(self)

    @classmethod
    def lookupType(cls, name):
        for item in cls.types:
            if item.name == name:
                return cls

TestBuilder.SLEEPY = TestBuilder("1","slow test", 500.0)
TestBuilder.SPEEDY = TestBuilder("2","fast test", 2000.0)

然后在测试模块中:

class Tester(unittest.TestCase):
    def test_builder(self):
        dummy = TestBuilder
        ref = dummy.SPEEDY
        objfound = dummy.lookupType("slow test")
        logger.debug("--test_builder() name: "+objfound.name)

虽然在lookupType方法中找到了正确的对象,但在测试中访问时,结果classfound name属性为空。如何访问给定属性之一的正确TestBuilder对象?你知道吗


Tags: 对象nametestselfuidstring属性static
1条回答
网友
1楼 · 发布于 2024-04-25 20:07:09

返回的是,而不是找到的实例:

@classmethod
def lookupType(cls, name):
    for item in cls.types:
        if item.name == name:
            return cls
            #      ^^^

返回项目:

return item

不要使用列表,而是使用字典注册您的类,这样您只需按名称查找即可:

class TestBuilder:
    types = {}

    def __init__(self, uid, name, speed):
        self.uid = uid
        self.name = name
        self.speed = speed
        self.types[name] = self

    @classmethod
    def lookupType(cls, name):
        return cls.types.get(name)

请注意,uid = str()speed = float()行只是分别创建设置为空字符串和0.0的类属性。这些行不声明类型,Python也不会阻止代码在实例级别为这些属性分配不同的对象。你知道吗

相关问题 更多 >