2016-12-06 7 views
0

クラスとサブクラスの内部でセットとディクショナリを使用する方法についての情報を見つけようとしています。クラスCountryとサブクラスCountryCatalogueを作成するように私に指示する課題があります。次に関数では、cDictionarycatalogueという辞書を作成します(これはリスト、セット、または辞書にすることができますが、私はセットを使用することにしましたが、あなたの提案に応じて変更する必要があります)。私はに実行している問題は、私がclass CountryCatalogue(Country):cDictionarycatalogueを初期化するとき、それは初期化され、私に与えるされている私にcatalogueを「見る」ことができます(例えば、__init__()findCountry()addCountry()、など)その下の機能を全く伝えていないということですこれらのリスト内のcatalogueにアクセスしようとすると「無効な変数」というエラーが発生し、__init__関数でそれらを初期化すると同じことが起こります。他の機能はそれを見ることはできませんが、少なくとも__init__は正常に動作します。クラス関数のセットとディクショナリー

残念ながら、クラスの種類の吸うと私たちは、pythonのためのすべての個別の重要な "テーマ"を教えていたが、一緒にそれらを使用する方法ではありませんでした。

例:__init__(self, ...)

class CountryCatalogue(Country): 
def __init__(self, filename = "", name = "", pop = 0, area = 0, continent = ""): 
    cDictionary = {}    #Initializing the cDictionary and catalogue here leads to errors in other functions 
    catalogue = [] 
    super().__init__(name = "",pop = 0,area = 0,continent = "") 
    fillcdict = open("continent.txt")  #not really important for the problem 
    linescdict = fillcdict.readlines()[1:] 
    for line in linescdict: 
     entries1 = line.split(",") 
     country = str(entries1[0]) 
     continentwrong = str(entries1[1]) 
     entries2 = continentwrong.split ("\n") 
     continent = str(entries2[0]) 
     cDictionary["keywords"] = country 
     cDictionary["values"] = continent 
    self._continent = continent 
    fillcatdict = open(filename) 
    linescatalogue = fillcatdict.readlines()[1:] 
    for line in linescatalogue: 
     entries = line.split("|") 
     countrydata = str(entries[0]) 
     populationdata = entries[1] 
     areadata = entries[2] 
     catalogue.append(countrydata) 

def findCountry(self):  #So, when I try and use catalogue in this function I get a 'unresolved reference' note in Pycharm and a "invalid variable' error if I run the problem 
    findcountinp = input("Please enter a country name: ") 
    if findcountinp in catalogue: 
     return self._name+"|"+self._continent+"|"+self._area+"|"+self._population 
    else: 
     return "Country not found!" 

答えて

0

catalogue = []は、その寿命メソッド戻り終了する方法内側可視ローカル変数を作成します。代わりにself.catalogue = []を実行し、使用するたびにself.catalogueとしてください。これにより、ローカル変数ではなくcatalogueがオブジェクトのメンバーになります。

+0

どのようにしてカタログから物事を取り除くことができますか? カタログは、別々のデータファイルで提供されるすべての国のリストです。私が質問に含めることのできなかった別の機能では、ユーザーに国を入力してからカタログを検索し、入力した国を削除するよう求めなければなりません。 – MezyMinzy

+0

'self.catalogue.pop(index)'または 'self.catalogue.remove(country)'です。あなたのデザインは容疑者です。 'CountryCatalogue'を' Country'のサブクラスにするのは意味がないと思いますよね?国のグループはどのようにして国家となっていますか?あるいは、 'Country'が' CountryCatalogue'として作成されている場合、 'catalogue'のメンバリストは国ごとに異なります。あなたは国と同じくらい多くのカタログを持っています。 –

+0

さて、国の関数の1つは、人口密度を計算するsetPopulationDensityです。しかし、次にCountryCatalogueにはfilterCountriesByPopDensityという関数があります。「人口密度範囲の上限と下限を入力して、その範囲内にある人口密度のすべての国を見つけるように尋ねます。人口密度を計算していることを示しています(私はCountryクラスから推測しています)。しかし、あるクラスから関数を取得して別のクラスで関数を使用する方法はわかりません。 – MezyMinzy

関連する問題