在Python中模拟C#类
我有以下公共课程:在Python中模拟C#类,c#,python,python-2.7,C#,Python,Python 2.7,我有以下公共课程: public class ClassA { public byte var1; public TypeX var2; } public class TypeX { public UInt16 num1; public UInt32 num2; } (在本例中,名称简化为非真实名称) 这在Python中是什么样子的?具体来说,如何将var2创建为TypeX的实例 到目前为止,我已经提出了以下Python类: class ClassA():
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是动态类型化的,而不是静态类型化的,所以
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
实例
但是,从Python3.5开始,您可以添加
这不会影响代码的运行方式(特别是它不会在运行时强制执行类型),但它可以帮助开发人员及其工具更好地理解代码
像这样的工具可以用来使用这些可选类型提示静态检查代码,特别是当您将它们添加到测试套件中时。添加的提示越多,mypy就越有帮助。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
实例
但是,从Python3.5开始,您可以添加
这不会影响代码的运行方式(特别是它不会在运行时强制执行类型),但它可以帮助开发人员及其工具更好地理解代码
像这样的工具可以用来使用这些可选类型提示静态检查代码,特别是当您将它们添加到测试套件中时。添加的提示越多,mypy的帮助就越多。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是一种动态类型语言。变量的类型只有在赋值后才能确定
最接近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不是静态类型语言,因此以下问题的答案是:
如何强制var2为TypeX类型
是你没有。当然,您可以键入check,但是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
Python不是静态类型的语言,因此以下问题的答案是: 如何强制var2为TypeX类型 是你没有。当然,您可以键入check,但是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
它们不是等价的,因为你没有给你的c变量赋值。当您试图从
ClassA
访问var1
或var2
时,会出现NullReferenceException
。这可以用构造函数很容易地解决。它们不是等价的,因为你没有给你的c变量赋值。当您试图从ClassA
访问var1
或var2
时,会出现NullReferenceException
。这可以用构造函数很容易地解决。没错,我知道Python没有强制类型。感谢您对\uuuu init\uuuu
中变量赋值的说明。我假设bytes()
和int()
键入发送给self的任何值。
。。。对于var2
,是否无法执行=TypeX()
?我猜不是,但为什么?@CtrlS确实有可能。但是它与你的C代码并不完全匹配。顺便说一句,bytes()
和int()
不进行任何类型转换。它们与写b''
和0
有趣的东西完全一样。。。这就是为什么注释是这样的。对,我知道Python没有强制类型。感谢您对\uuuu init\uuuu
中变量赋值的说明。我假设bytes()
和int()
键入发送给self的任何值。
。。。对于var2
,是否无法执行=TypeX()
?我猜不是,但为什么?@CtrlS确实有可能。但是它与你的C代码并不完全匹配。顺便说一句,bytes()
和int()
不进行任何类型转换。它们与写b''
和0
有趣的东西完全一样。。。这就是为什么评论是这样的。