首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确记录hasattr()用法

如何正确记录hasattr()用法
EN

Stack Overflow用户
提问于 2012-09-12 17:57:47
回答 3查看 132关注 0票数 0

我发现使用isinstance()并不被认为是巨蟒式的,人们建议使用hasattr()

我想知道记录使用hasattr()的函数的正确用法的最好方法是什么。

例如:我从不同的网站(例如雅虎财经,谷歌财经)获得股票数据,并且有GoogleFinanceDataYahooFinanceData类,它们都有一个方法get_stock(date)。还有一个函数可以比较两只股票的价值:

代码语言:javascript
复制
def compare_stocks(stock1,stock2,date):
    if hasattr(stock1,'get_stock') and hasattr(stock2,'get_stock'):
        if stock1.get_stock(date) < stock2.get_stock(date):
            print "stock1 < stock2"
        else:
            print "stock1 > stock2"

该函数的用法如下:

代码语言:javascript
复制
compare_stocks(GoogleFinanceData('Microsoft'),YahooFinanceData('Apple'),'2012-03-14')

它不是这样使用的:

代码语言:javascript
复制
compare_stocks('Tree',123,'bla')

问题是:我如何让人们知道他们可以为stock1stock2使用哪些类?我是不是应该写一个像"stock1 and stock2 ought to have a method get_stock"这样的文档字符串,然后人们必须自己查看源代码?或者我将所有正确的类放到一个模块中,并在文档字符串中引用该文件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-12 18:11:06

我看不出isinstance()的用法有什么不妥,我会创建一个基类并参考基类的文档。

代码语言:javascript
复制
def compare_stocks(stock1, stock2, date):
    """ Compares stock data of two FinanceData objects at a certain time. """
    if isinstance(stock1, FinanceData) and isinstance(stock2, FinanceData):
        return 'comparison'

class FinanceData(object):
    def get_stock(self, date):
        """ Returns stock data in format XX, expects parameter date in format YY """
        raise NotImplementedError

class GoogleFinanceData(FinanceData):
    def get_stock(self, date):
        """ Implements FinanceData.get_stock() """
        return 'important data'

正如您所看到的,我在这里没有使用鸭子类型,但是既然您在文档中提出了这个问题,我认为这是一种更简洁的可读性方法。每当另一个开发人员看到compare_stocks函数或get_stock方法时,他就会确切地知道他必须在哪里查找有关功能、数据结构或实现细节的进一步信息。

票数 1
EN

Stack Overflow用户

发布于 2012-09-12 18:10:58

如果您所做的只是使用*FinanceData实例调用函数,那么我甚至不会费心测试get_stock方法;传入任何其他内容都是错误的,并且如果有人传入字符串,函数就会中断。

换句话说,只需将您的函数记录为预期的get_stock()方法,而根本不进行测试。鸭子类型适用于需要接受截然不同类型的输入的代码,而不适用于只适用于一种特定类型的代码。

票数 3
EN

Stack Overflow用户

发布于 2012-09-12 18:00:09

按你的建议做,在文档字符串中输入传递的参数应该有一个get_stock函数,这是你的函数所需要的,列出类是不好的,因为当适合某人时,代码可能很好地与派生类或其他类一起使用。

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

https://stackoverflow.com/questions/12385619

复制
相关文章

相似问题

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