具有多个签名的默认属性

时间:2019-06-13 14:15:32

标签: python

我正在尝试将VB.Net类转换为Python,但是我不知道处理默认属性的最佳方法。使用了多个定义。

我想提供一个尽可能短的语言翻译课程。我的基本语言是VB.Net,它已经可以在其中运行了。现在是Python的语法问题。

例如,我想让开发人员代码:

MyLabel.Text = L("MyDialog.MyLabel.Text")

使用默认语言。而且...

MyLabel.Text = L("MyDialog.MyLabel.Text", "de")

…强迫一种语言,但是…

MyLabel.Text = L("MyDialog.MyLabel.Text", "en", parameter1, parameter2…)

向其中添加替换参数。

要进行替换,将使用.Net样式,例如“ Hello {0}”,其中{0}将替换为parameter1。没什么可担心的。但是参数是可变的。可以为无或1到n个字符串。

但是我如何才能归档Python中的最佳方法呢? 该属性的原始定义为:

Default Public ReadOnly Property Item(Key As String, Language As String, ParamArray Args As Object()) As String
…

Default Public ReadOnly Property Item(Key As String, Language As String) As String
…

Default Public ReadOnly Property Item(Key As String) As String
…

L是类实例的变量。因为它是默认属性,所以不需要.Item。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是一个类定义的示例,我认为它满足您的要求:

class L:
    # constructor
    def __init__(self, key, language="en", *args):
        self.key = key
        self.langauge = language
        for arg in args:
            # do something

因此,以下所有条件均有效:

a = L("MyDialog.MyLabel.Text")  # language is set to "en" by default
b = L("MyDialog.MyLabel.Text", "de")  # language is "de"
c = L("MyDialog.MyLabel.Text", "en", param1, param2)  # assuming param1 and param2 are defined

在构造函数定义中(或在任何函数/方法定义中),只需说name=defaultvalue,即可指定参数的“默认值”。如上所述,用于获取任意数量的位置参数的python语法为*args-与VisualBasic相似,一旦进入函数内部,就必须将其视为列表,必须迭代或索引到其中为了使用它。

(作为奖励,您还可以指定一组任意的关键字参数,这些参数必须以key=value的形式给出,而不是以顺序给出。是**kwargs而不是*args(或除了kwargs之外,并且dict可以被视为函数内的 <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-ImportXHTML</artifactId> <version>8.0.0</version> </dependency> <dependency> <groupId>org.docx4j</groupId> <artifactId>xhtmlrenderer</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-xjc</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-xjc</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-jxc</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>com.googlecode.jaxb-namespaceprefixmapper-interfaces</groupId> <artifactId>JAXBNamespacePrefixMapper</artifactId> <version>2.2.4</version> <scope>runtime</scope> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>