假设我有一个带有字符串实例属性的类。 我应该使用“”值还是无来初始化此属性?好吗?
def __init__(self, mystr="")
self.mystr = mystr
或
def __init__(self, mystr=None)
self.mystr = mystr
修改:我认为如果我使用“”作为初始值,我会“声明”变量为字符串类型。然后我将无法再为其分配任何其他类型。我是对的吗?
编辑:我认为这里需要注意的是,我的建议是错误的。将另一种类型分配给变量没有问题。我喜欢 S.Lott 的评论:“因为Python中的任何内容都没有”声明“,所以你没有考虑到这一点。”
答案 0 :(得分:65)
如果没有值在程序中有意义(例如可选值),则应使用None。无论如何,这都是它的目的。
如果值必须由__init__的调用者提供,我建议不要初始化它。
如果“”作为默认值有意义,请使用它。
在Python中,类型是从用法中推导出来的。因此,您只需指定另一种类型的值即可更改类型。
>>> x = None
>>> print type(x)
<type 'NoneType'>
>>> x = "text"
>>> print type(x)
<type 'str'>
>>> x = 42
>>> print type(x)
<type 'int'>
答案 1 :(得分:11)
None用于表示“未设置”,而任何其他值用于表示“默认”值。
因此,如果您的类处理空字符串并且您希望它作为默认值,请使用“”。如果您的类需要检查变量是否已设置,请使用无。
请注意,如果您的变量最初是一个字符串并不重要。您可以在任何其他时刻将其更改为任何其他类型/值。
答案 2 :(得分:8)
初始化空字符串的另一种方法是使用不带参数的内置str()
函数。
STR(对象= '')
返回一个包含对象的可打印表示的字符串。
...
如果没有给出参数,则返回空字符串''。
在原始示例中,看起来像这样:
def __init__(self, mystr=str())
self.mystr = mystr
就个人而言,我相信这更好地传达了你的意图。
请注意str()
本身设置默认参数值''
的方式。
答案 3 :(得分:5)
这取决于。如果要区分根本没有传入的参数和传入的空字符串,可以使用None。
答案 4 :(得分:5)
可能没问题,但我认为没有明确的答案。
None
进行比较优于与""
进行比较,因为""
可能是有效值,""
可能更好,因为它实际上是一个字符串,您可以在其上调用字符串方法。如果您使用None
,则会导致例外情况。""
可以提供帮助。如果你有一个循环,请说:
def myfunc (self, mystr = ""):
for other in self.strs:
mystr = self.otherfunc (mystr, other)
然后潜在的未来优化器会知道str
始终是一个字符串。如果你使用None
,那么在第一次迭代之前它可能不是一个字符串,这需要循环展开以获得相同的效果。虽然这不是一个假设(它在我的PHP编译器中出现了很多),但你绝对不应该编写代码来考虑这一点。我只是觉得它可能很有趣:)
答案 5 :(得分:3)
要么很好,尽管None
作为约定更常见 - None
表示没有为可选参数传递值。
是“”是正确使用的默认值的时间 - 根据我的经验,这些时间不常发生。
答案 6 :(得分:1)
由于None和“”都是假的,你可以同时做到这两点。请参阅6.1. Truth Value Testing。
修改强>
要回答编辑中的问题:不,您可以指定其他类型。
>>> a = ""
>>> type(a)
<type 'str'>
>>> a = 1
>>> type(a)
<type 'int'>
答案 7 :(得分:1)
对于列表或词组,答案更清楚, 根据{{3}} 使用None作为默认参数。
但是对于字符串,一个(空)字符串对象在运行时被实例化 关键字参数。
最干净的方式可能是:
def myfunc(self, my_string=None):
self.my_string = my_string or "" # or a if-else-branch, ...
答案 8 :(得分:1)
在python中,两种方法都可以。我个人更喜欢“”。但是同样,两种方法都可以
>>>x = None
>>>print(x)
None
>>>type(x)
<class 'NoneType'>
>>>x = "hello there"
>>>print(x)
hello there
>>>type(x)
<class 'str'>
>>>
>>>x = ""
>>>print(x)
>>>type(x)
<class 'str'>
>>>x = "hello there"
>>>type(x)
<class 'str'>
>>>print(x)
hello there
答案 9 :(得分:0)
empty_string = ""
if not empty_string:
print "Empty string is not set"
=>未设置空字符串
if empty_string is not None:
print "Empty string is not None"
=>空字符串不是None
答案 10 :(得分:0)
Python哲学要易读。
这就是为什么最好在__init__()
中定义属性的原因,即使它是可选的。
本着同样的精神,您必须问自己,对于阅读您的代码的人来说,哪种方法更清晰。实际上,类型本身提供了有关变量将来使用的许多信息。所以:
kind = None
从语法上来说是正确的,但是读者了解的并不多。它是字符串,整数代码还是列表等?
kind_str = None
kind = ""
两个都多说一遍,第一个在名称中具有类型,第二个在其声明中。我会第二次去,更整齐。