python 方法在 Class 之外有效,但在 Class 之内无效

python method works outside of Class, but not within Class

我是 python 的新手,正在尝试理解和使用 classes。我有一个简单的邮政编码 Class,它将邮政编码作为一个字符串并生成一个对象。但是,调用任何方法总是 returns 找不到邮政编码。如果我 运行 class 块之外的任何方法,它都可以正常工作。任何想法或想法表示赞赏。顺便说一句,我正在为这个小项目使用 pyzipcode 库。

from pyzipcode import ZipCodeDatabase

class zipCodeProcessor(object):

    def __init__(self, zipcode):
        self.zipcode = zipcode

    #method to extract the Timezone from a given zip code
    def zipToTimezone(zip):
        zipCodeDB = ZipCodeDatabase()
        zipTimezoneQuery = zipCodeDB[zip]
        return zipTimezoneQuery.timezone

    #method to extract the city from a given zip code using pyzipcode
    def zipToCity(zipcode):
        zipCodeDB = ZipCodeDatabase()
        zipCityQuery = zipCodeDB[zipcode]
        return zipCityQuery.city

    #method to extract the state from a given zip code using pyzipcode
    def zipToState(zip):
        zipCodeDB = ZipCodeDatabase()
        zipStateQuery = zipCodeDB[zip]
        return zipStateQuery.state

zipObject = zipCodeProcessor('10005')
zipObject.zipToState()

缺少 "self" 作为第一个参数:

例如,def zipToState(self, zip): ...

毫无疑问,作为独立函数运行良好的代码无法作为 class 的一部分运行。 Python 不是魔法。您需要修改您的方法,不要将邮政编码作为参数。在初始化实例时,您已将 zipcode 作为实例的属性存储,因此您应该在方法中使用 self.zipcode(当然,并接受 self 作为参数)。

例如:

def zipToState(self):
    zipCodeDB = ZipCodeDatabase()
    zipStateQuery = zipCodeDB[self.zipcode]
    return zipStateQuery.state

作为优化,您还应该考虑不要为每个方法调用实例化新的 ZipCodeDatabase 对象。您可能会创建一个实例(或每个 zipCodeProcessor 个实例创建一个实例),具体取决于它的重量级(不熟悉该特定模块,抱歉)。

zipcode 是 class-local 变量,所以你应该像这样声明你的方法:

def zipToState(self):
    zipCodeDB = ZipCodeDatabase()
    zipStateQuery = zipCodeDB[self.zipcode]
    return zipStateQuery.state