我正在尝试将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。
谢谢。
答案 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>
)