首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python推理

Python推理
EN

Stack Overflow用户
提问于 2018-07-04 14:11:49
回答 2查看 92关注 0票数 0

我对python很陌生,但对编程却不是很熟悉。有什么方法可以知道两个对象是否具有相同的函数和字段?

我有这样的情况

代码语言:javascript
复制
var1 = func1()
var2 = func2()
func3(var1)
func3(var2)

func1func2都是我使用的库中的函数,它们几乎没有文档。

var1var2很有可能是同一类型的对象,但我怎么确定呢?

假设我知道func3(var1)可以工作,我能知道它是否适用于var2吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-04 14:19:49

首先,Python通常使用鸭型:如果对象具有所需的属性和方法,那么可以使用它。您可以这样检查它:

代码语言:javascript
复制
if hasattr(var2, 'method_name'):
   ... your code ...

管道类型实现的另一种方法是隐式的。例如,如果您的函数增加了它的参数,您可以不检查参数,只需编写:

代码语言:javascript
复制
result = int(var1) + 1

如果不能将var1转换为int,用户将得到一个可读的错误:

代码语言:javascript
复制
TypeError: int() argument must be a string or a number, not 'MyCustomClass'

第二个,如果var是某个类(或其后代)的实例,则可以显式地检查。如果您知道var1dict的一个实例

代码语言:javascript
复制
if isinstance(var2, dict):
    ... your code ...

如果var2dictdefaultdictdict的其他子类的实例,则此代码将工作。

结论:不存在单一的验证参数接收。您总是需要在保护不受无效属性值和代码可读性之间保持平衡。假设您是调用函数的用户:参数应该具有什么样的类型?如果你传递了错误的值,这个错误可以理解吗?

票数 2
EN

Stack Overflow用户

发布于 2018-07-04 14:17:24

有什么方法可以知道两个对象是否具有相同的函数和字段?

从技术上讲是的,不过我不推荐。您可以比较每个调用的dir的结果。

代码语言:javascript
复制
if dir(var1) == dir(var2):
    # both have the same attributes

然而,我仍然不建议这样做,因为这是多么脆弱。如果var1var2都实现了一个名为frobnicate的函数,但定义却完全不同,那么dir将无法知道它们是不同的。

稍微好一点的是比较以下类型:

代码语言:javascript
复制
if type(var1) == type(var2):
    # both are objects of the same type

但这并没有多大帮助,因为拥有相同的类型并不能确保它们具有相同的属性。

假设我知道func3(var1)可以工作,我能知道它是否适用于var2吗?

代码语言:javascript
复制
if var1 is var2:
    # it'll work

真的就是这样。如果var1var2都是相同的对象,那么您知道它的工作原理是一样的。任何其他答案都依赖于func3的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51175710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档