Python中的静态初始化程序

时间:2014-12-07 06:17:34

标签: java python

我的问题类似于Is there a static constructor or static initializer in Python?。但是,我仍然没有像在Java中那样实现静态构造函数:

public class TestBuilder {
    private String uid;
    private String name;
    private double speed;

    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;
    }

    public double getSpeed(){
        return speed;
    }

    public String getUid() {
        return uid;
    }

    public String getName() {
        return name;
    }

在另一个类的java中,我可以调用TestBuilder.SLEEPY来访问一个填充的类。

在python中我尝试过:

class TestBuilder:
    uid = str()
    name = str()
    speed = float()

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

    def lookupByName(self, name):
        result = None
        members = [attr for attr in dir(TestBuilder()) if not callable(attr) and not   attr.startswith("__")]
        for testbuilder in members:
        if testbuilder.name == name:
            result = testbuilder.uid
            break         
        return result

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

然后在另一个模块中我尝试了:

from examples.testbuilder import TestBuilder
import unittest

class Tester(unittest.TestCase):

    def test_builder(self):
        dummy = TestBuilder
        ref = dummy.SPEEDY
        sleepyid = dummy.lookupByName("slow test")
        self.assertTrue(dummy.SPEEDY.__str__() == ref.__str__())
        self.assertEqual(1, sleepyid)

但是我得到一个“TypeError:lookupByName()缺少1个必需的位置参数:'name'”在dummy.lookupByName(“慢测试”)调用上,我不知道为什么。 这看起来像生成与Java静态初始化程序类似的功能的“pythonic”方式吗?还有其他选择吗?

1 个答案:

答案 0 :(得分:3)

问题是lookupByName不是静态的,并且期望隐含的第一个参数self。在类定义中使用staticmethod装饰器:

class TestBuilder:
    ...
    @staticmethod
    def lookupByName(name):
        result = None
        ...

此问题提供了有关静态方法的更多信息:Static methods in Python?