python方法在类外工作,但不在类内工作

python方法在类外工作,但不在类内工作,python,class,Python,Class,我是python新手,正在尝试理解和使用类。我有一个简单的zipcode类,它将邮政编码作为字符串并生成一个对象。但是,调用任何方法都会返回未找到的邮政编码。如果我在类块之外运行任何方法,它都可以正常工作。任何想法或想法都是值得赞赏的。顺便说一句,我正在为这个小项目使用pyzipcode库 from pyzipcode import ZipCodeDatabase class zipCodeProcessor(object): def __init__(self, zipcode):

我是python新手,正在尝试理解和使用类。我有一个简单的zipcode类,它将邮政编码作为字符串并生成一个对象。但是,调用任何方法都会返回未找到的邮政编码。如果我在类块之外运行任何方法,它都可以正常工作。任何想法或想法都是值得赞赏的。顺便说一句,我正在为这个小项目使用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):

作为独立函数运行良好的代码不作为类的一部分运行,这一点也不奇怪。Python不是魔法。您需要修改您的方法,以避免将邮政编码作为参数。在初始化实例时,您已经将
zipcode
存储为实例的属性,因此您应该在方法中使用
self.zipcode
(当然,还应该接受
self
作为参数)

例如:

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

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

zipcode是类局部变量,因此您应该声明如下方法:

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

您是否忘记在对象方法中添加一个
self
?这可能特别有助于类和实例变量。该链接是针对2.7.9的,我建议您查看有关如何使用类的基本教程