我对python很陌生,但对编程却不是很熟悉。有什么方法可以知道两个对象是否具有相同的函数和字段?
我有这样的情况
var1 = func1()
var2 = func2()
func3(var1)
func3(var2)func1和func2都是我使用的库中的函数,它们几乎没有文档。
var1和var2很有可能是同一类型的对象,但我怎么确定呢?
假设我知道func3(var1)可以工作,我能知道它是否适用于var2吗?
发布于 2018-07-04 14:19:49
首先,Python通常使用鸭型:如果对象具有所需的属性和方法,那么可以使用它。您可以这样检查它:
if hasattr(var2, 'method_name'):
... your code ...管道类型实现的另一种方法是隐式的。例如,如果您的函数增加了它的参数,您可以不检查参数,只需编写:
result = int(var1) + 1如果不能将var1转换为int,用户将得到一个可读的错误:
TypeError: int() argument must be a string or a number, not 'MyCustomClass'第二个,如果var是某个类(或其后代)的实例,则可以显式地检查。如果您知道var1是dict的一个实例
if isinstance(var2, dict):
... your code ...如果var2是dict、defaultdict或dict的其他子类的实例,则此代码将工作。
结论:不存在单一的验证参数接收。您总是需要在保护不受无效属性值和代码可读性之间保持平衡。假设您是调用函数的用户:参数应该具有什么样的类型?如果你传递了错误的值,这个错误可以理解吗?
发布于 2018-07-04 14:17:24
有什么方法可以知道两个对象是否具有相同的函数和字段?
从技术上讲是的,不过我不推荐。您可以比较每个调用的dir的结果。
if dir(var1) == dir(var2):
# both have the same attributes然而,我仍然不建议这样做,因为这是多么脆弱。如果var1和var2都实现了一个名为frobnicate的函数,但定义却完全不同,那么dir将无法知道它们是不同的。
稍微好一点的是比较以下类型:
if type(var1) == type(var2):
# both are objects of the same type但这并没有多大帮助,因为拥有相同的类型并不能确保它们具有相同的属性。
假设我知道
func3(var1)可以工作,我能知道它是否适用于var2吗?
if var1 is var2:
# it'll work真的就是这样。如果var1和var2都是相同的对象,那么您知道它的工作原理是一样的。任何其他答案都依赖于func3的定义。
https://stackoverflow.com/questions/51175710
复制相似问题