Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编写/阅读python代码时,人们如何判断变量是否为对象?_Python_Object_Naming Conventions - Fatal编程技术网

在编写/阅读python代码时,人们如何判断变量是否为对象?

在编写/阅读python代码时,人们如何判断变量是否为对象?,python,object,naming-conventions,Python,Object,Naming Conventions,例如,如果我正在阅读一些类似这样的代码: list_of_objects = function_returning_object_list() for object in list_of_objects: do_something(object.param) 不是对象。get_param有点奇怪,如果你只是在读代码,却不知道函数返回对象列表()实际上返回了对象列表?如果没有变量类型,如何通过命名约定避免这种混淆 希望我说得清楚。好吧,Python中的所有东西都是对象。这里适当的问题是,

例如,如果我正在阅读一些类似这样的代码:

list_of_objects = function_returning_object_list()
for object in list_of_objects:
    do_something(object.param)
不是
对象。get_param
有点奇怪,如果你只是在读代码,却不知道
函数返回对象列表()
实际上返回了对象列表?如果没有变量类型,如何通过命名约定避免这种混淆


希望我说得清楚。

好吧,Python中的所有东西都是对象。这里适当的问题是,是否每个返回的对象都有
param
属性

In [17]: a = 1

In [18]: type(a)
Out[18]: int

In [19]: b = 'b'

In [20]: type(b)
Out[20]: str

In [21]: c = True

In [22]: type(c)
Out[22]: bool

如果你看上面的例子,你会发现它们是
str
int
bool
类型的对象。问题是这些问题都没有
param
属性。

这可能主要是一个基于观点的问题,但我会尝试回答

In [17]: a = 1

In [18]: type(a)
Out[18]: int

In [19]: b = 'b'

In [20]: type(b)
Out[20]: str

In [21]: c = True

In [22]: type(c)
Out[22]: bool
无论使用何种语言,好的变量名总是有用的。如果你有一个函数名,比如说,
get_data
,你就不能真正推断出该数据是一个对象还是一个列表或者什么。但是,如果您有一个
类Bunny
和一个名为
get_bunnies
的函数,则可以安全地假设它将返回某种类型的集合。当然,始终存在这样一个问题:例如,集合是
列表还是
dict

但是,如果你只是像那样阅读代码,你可以很快推断,如果它与关键字一起使用,它就是一个
dict
,或者它的一些派生词

简而言之,“如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样呱呱叫,那么它很可能就是鸭子”。这意味着,即使
get_bunnies
返回了
dict
的一些奇特的子类,只要它实现了正确的
\u dunder\u
-方法,您也应该能够像使用
dict
一样使用它

Duck类型当然总是会带来一些强类型无法解决的问题,但这通常只是一个惯例问题。如果您不确定某个函数将返回什么,您可以始终测试它:在代码中,在解释器中,甚至查找源代码

关于命名变量的“匈牙利符号”,如
strName
name\u string
。。。我一直同意Robert C.Martin的观点,即它给变量名带来了不必要的冗余。当然,动态输入的冗余性并没有那么差,但即便如此,我还是不喜欢它。在阅读代码和搜索代码时,它往往会使事情变得更加困难。或者更重要的是,当变量类型更改而不更改名称时


如果既没有可用的示例代码,也没有良好的命名,则需要查找源代码,或者希望函数定义中包含docstring。如果您运气好,并且docstrings已经定义并且是最新的,那么一个好的IDE将帮助您解析该字符串,甚至解析函数的整个定义,而无需自己查找源文件

您可以随时检查它的类型,例如,使用
type()
。但一般来说,在编写良好的代码中,对象的类型应该非常清楚,并且通常由函数名暗示。我想我想知道的是,通过类型象征性地引用对象是否是一个好主意。例如,如何区分
wow_string=str('wow')
wow_string=CustomStringClass('wow')
,或者这些符号是否是好的。您可以使用
isinstance
检查对象属于这两个类中的哪一个。如果这是您的问题,匈牙利符号被认为是高度非音阶的。这或多或少是我想要的答案。谢谢