模仿Python中的C#类

时间:2018-09-18 15:55:36

标签: c# python python-2.7

我有以下 C#公共课程:

public class ClassA
{
    public byte var1;
    public TypeX var2;
}


public class TypeX
{
    public UInt16 num1;
    public UInt32 num2;
}

(此示例中的名称已简化,并非真实名称)

这在Python中是什么样的?具体来说,如何将var2创建为TypeX的实例?

到目前为止,我已经提出了以下 Python 类:

class ClassA():
    def __init__(self, var1, var2 = TypeX):
        self.var1 = var1
        self.var2 = var2


class TypeX():
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

但是,我几乎100%确信这是不正确的。 ClassA应该继承TypeX吗?任何指导或解释将不胜感激!

3 个答案:

答案 0 :(得分:2)

Python是一种动态类型的语言。变量的类型只有在分配值之后才能确定。

与C#代码最接近的地方是使用类型提示,Python 3.5+支持此类型提示:

class TypeX:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

class ClassA:
    def __init__(self, var1, var2: TypeX):
        self.var1 = var1
        self.var2 = var2

但是即使有类型提示,var2的类型也不会在编译时或运行时强制执行。

答案 1 :(得分:1)

Python是动态(而非静态)类型的,因此

class ClassA():
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2


class TypeX():
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

是合理的事情。实例化TypeX时只需传递ClassA的实例。

但是,从Python 3.5开始,您可以添加optional type hints,例如

class TypeX():
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2


class ClassA():
    def __init__(self, var1, var2: TypeX):
        self.var1 = var1
        self.var2 = var2

这不会影响代码的运行方式(特别是不会在运行时强制类型),但可以帮助开发人员及其工具更好地理解代码。

诸如mypy之类的工具可用于通过这些可选的类型提示来静态检查代码,尤其是将其添加到测试套件中时。您添加的提示越多,mypy的帮助就越多。

答案 2 :(得分:1)

Python不是静态类型的语言,因此答案为:

  

如何将var2强制为TypeX类型?

您不是。当然,您可以对某些内容进行类型检查,但Python解释器不会帮您完成检查,您需要以编程方式在代码上显式编写此规则。

关于以下内容的问题:

public class ClassA
{
    public byte var1;
    public TypeX var2;
}


public class TypeX
{
    public UInt16 num1;
    public UInt32 num2;
}

翻译成Python,答案很简单:

# You need to explicitly initialize the variables to their correspondent default values
class ClassA(object):
    def __init__(self):
        self.var1 = bytes() # or b''
        self.var2 = None

class TypeX(object):
    def __init__(self):
        self.num1 = int() # or 0
        self.num2 = int() # or 0