繁体   English   中英

模仿Python中的C#类

[英]Mimic C# classes in Python

我有以下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 任何指导或解释将不胜感激!

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的类型。

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

是一件合理的事情。 实例化ClassA时,只需传入TypeX的实例TypeX

但是,从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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM