2017-12-05 4 views
0

私は4つのクラスを持っています。肉の値、稲の値、豆の値をそれぞれのクラスに渡して、Burritoクラスを通してその値を返します。私は2日間はこれと戦いましたが、目に見える進歩はありません。何をすべきか、どんな文法上の誤りでもお詫びします。以下は最初の3つのクラスです。最初の3つのクラスのいずれの行にも触れないように指示された指示に従って、すべてのコードの変更はBurritoクラスにある必要があります。ブリトークラスから肉クラス、米クラス、豆クラスに私の肉、米、豆の価値を渡す方法は?

class Meat: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["chicken", "pork", "steak", "tofu"]: 
      self.value = value 
     else: 
      self.value = False 

class Rice: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["brown", "white"]: 
      self.value = value 
     else: 
      self.value = False 

class Beans: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["black", "pinto"]: 
      self.value = value 
     else: 
      self.value = False 

ここでクラスは、値を渡して値を返すと仮定しています。ここで

class Burrito: 
    def __init__ (self, meat, to_go, rice, beans): 
     self.meat = Meat(meat) 
     self.set_to_go(to_go) 
     self.rice = Rice(rice) 
     self.beans = Beans(beans) 

    def set_meat(self, meat): 
     self.set_value(meat) 

    def set_to_go(self, to_go): 
     to_go_list = [True, False] 
     if to_go in to_go_list: 
      self.to_go = to_go 
     else: 
      self.to_go = False 

    def set_rice(self, rice): 
     self.set_value(rice) 

    def set_beans(self, beans): 
     self.set_value(beans) 

    def get_meat(self): 
     self.meat_v = Meat() 
     return self.meat_v.value 

    def get_to_go(self): 
     return self.to_go 

    def get_rice(self): 
     self.rice_v = Rice() 
     return self.rice_v.value 

    def get_beans(self): 
     self.beans_v = Beans() 
     return self.beans_v.value 

私のコードをテストするために使用していますラインです:

newburrito = Burrito("pork", True, "brown", "pinto") 
print (newburrito.meat) 

これは、エラーラインで取得しています:

<__main__.Meat object at 0x7fa5ad8bccf8> 

は、それが

pork 
を印刷するように期待してい
+1

個々のクラス値にアクセスするには、単に 'newburrito.meat.get_value()'を実行するだけです。私はそこに何かエラーを見ていない。あなたは 'newburrito.meat'(オブジェクトを返す)を出力しました。 –

+0

'get_meat'を' newburrito.get_meat() 'と呼ぶ – Manjunath

+0

私のプリント(newburrito.meat)は、豚肉を印刷すると仮定しています – user8964866

答えて

1

まず、エラーは発生していません。あなたはオブジェクトの肉にprintを呼び出しました。それは起こったことです。オブジェクトはクラスMeatであり、メモリ内にこのインスタンスのアドレスも表示されています。

属性valueに保存されている値をMeatクラスインスタンス内に印刷する場合は、すでにコメント内で指し示されているので、print(newburrito.meat.get_value())を実行する必要があります。

0

このエクササイズは、Pythonのプロパティに関するものです。あなたが返すようにnewburrito.meat"pork"を期待している場合、これはmeatはあなたのコードがそれをどのように定義するかではない方法、またクラスインスタンス、クラスBurrito、の財産であることを意味します。

ステップ1.プライベート、を行くために、クラスのメンバーしてください。規則では、アンダースコアで名前を開始することです:

class Burrito: 
    def __init__ (self, meat, to_go, rice, beans): 
     self._meat = Meat(meat) 
     self._to_go = to_go 
     self._rice = Rice(rice) 
     self._beans = Beans(beans) 

ステップ2:を行くためにを返すようにプロパティを定義します。このためにはゲッタメソッド(デコレータ@property)とセッタメソッド(デコレータ@xxxxx.setter)が必要です。プロパティの定義は、Burritoクラス内になります。インデントを正しく取得してください。

class Burrito: 

    # ... continued ... 

    @property 
    def meat(self): 
     return self._meat.get_value() 
    @meat.setter 
    def meat(self,value): 
     self._meat.set_value(value) 

    @property 
    def to_go(self): 
     return self._to_go 
    @to_go.setter 
    def to_go(self,value): 
     self._to_go = isinstance(value,bool) and value 

    @property 
    def rice(self): 
     return self._rice.get_value() 
    @rice.setter 
    def rice(self,value): 
     self._rice.set_value(value) 

    @property 
    def beans(self): 
     return self._beans.get_value() 
    @beans.setter 
    def beans(self, value): 
     self._beans.set_value(value) 

彼らはBurritoのインスタンス変数だったが、あなたはr値としてそれらを使用する場合、代わりに、インタプリタはgetterメソッドを呼び出して、あなたがそれらを使用する場合かのように、あなたはなど、.riceをプロパティ.meatを使用することができますl-値として、インタプリタはsetterメソッドを呼び出します。

それは次のようにどのように機能するかあなたが見ることができます:

newburrito = Burrito("pork", True, "brown", "pinto") 
print (newburrito.meat) 
print (newburrito.rice) 
print (newburrito.beans) 
print (newburrito.to_go) 

newburrito.meat = 'tofu' 
print (newburrito.meat) 

出力は、私はあなたのコードから得たすべてのポインタに感謝の努力のための

pork 
brown 
pinto 
True 
tofu 
0

みんなありがとうです。 @BoarGulesは初心者のように私にPythonの全く新しいアイデアを教えてくれてありがとう。私はさらにPythonのプロパティを調べ、将来の課題のために私のツールキットに何が追加されているのかを見ていきます。ここで皆からインスピレーションを得て作業コードを書くことになりました。まず触れることを意図していないすべての最初の三つのクラスの:

class Meat: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["chicken", "pork", "steak", "tofu"]: 
      self.value = value 
     else: 
      self.value = False 

class Rice: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["brown", "white"]: 
      self.value = value 
     else: 
      self.value = False 

class Beans: 
    def __init__(self, value=False): 
     self.set_value(value) 

    def get_value(self): 
     return self.value 

    def set_value(self, value): 
     if value in ["black", "pinto"]: 
      self.value = value 
     else: 
      self.value = False 

私の作業ブリトークラス:

class Burrito: 
    def __init__ (self, meat, to_go, rice, beans, extra_meat = False, guacamole = False, cheese = False, pico = False, corn = False): 
     self.meat = Meat(meat) 
     self.set_to_go(to_go) 
     self.rice = Rice(rice) 
     self.beans = Beans(beans) 
     self.set_extra_meat(extra_meat) 
     self.set_guacamole(guacamole) 
     self.set_cheese(cheese) 
     self.set_pico(pico) 
     self.set_corn(corn) 
    def set_meat(self, meat): 
     self.meat.set_value(meat) 
    def set_to_go(self, to_go): 
     to_go_list = [True, False] 
     if to_go in to_go_list: 
      self.to_go = to_go 
     else: 
      self.to_go = False 
    def set_rice(self, rice): 
     self.rice.set_value(rice) 
    def set_beans(self, beans): 
     self.beans.set_value(beans) 
    def set_extra_meat(self, extra_meat): 
     extra_meat_list = [True, False] 
     if extra_meat in extra_meat_list: 
      self.extra_meat = extra_meat 
     else: 
      self.extra_meat = False 
    def set_guacamole(self, guacamole): 
     guacamole_list = [True, False] 
     if guacamole in guacamole_list: 
      self.guacamole = guacamole 
     else: 
      self.guacamole = False 
    def set_cheese(self, cheese): 
     cheese_list = [True, False] 
     if cheese in cheese_list: 
      self.cheese = cheese 
     else: 
      self.cheese = False 
    def set_pico(self, pico): 
     pico_list = [True, False] 
     if pico in pico_list: 
      self.pico = pico 
     else: 
      self.pico = False 
    def set_corn(self, corn): 
     corn_list = [True, False] 
     if corn in corn_list: 
      self.corn = corn 
     else: 
      self.corn = False 

    def get_cost(self): 
     cost = 5 
     if self.meat.get_value() == "chicken" or self.meat.get_value() == "pork" or self.meat.get_value() == "tofu": 
      cost += 1 
     if self.meat.get_value() == "steak": 
      cost += 1.50 
     if self.extra_meat == True and not self.meat.get_value() == False: 
      cost += 1 
     if self.guacamole == True: 
      cost += 0.75 
     return cost 

    def get_meat(self): 
     return self.meat.get_value() 

    def get_to_go(self): 
     return self.to_go 

    def get_rice(self): 
     return self.rice.get_value() 

    def get_beans(self): 
     return self.beans.get_value() 

    def get_extra_meat(self): 
     return self.extra_meat 

    def get_guacamole(self): 
     return self.guacamole 

    def get_cheese(self): 
     return self.cheese 

    def get_pico(self): 
     return self.pico 

    def get_corn(self): 
     return self.corn 

と通信するためのブリトークラスの肉、米と豆のインスタンスを取得するには上記の3つのクラスは、クラス取得者とセッターをBurritoクラスのゲッターとセッターに呼び出す必要があります。上記のブリトークラスに見られるように

def set_meat(self, meat): 
     self.meat.set_value(meat) 

:私は単にこのようブリトーで肉の方法のための私のセッターを書くブリトークラスから肉クラスに肉のインスタンスを送信する例。同じことが豆と米にも当てはまります。

ここから値を呼び出すには、それぞれのクラスゲッターをBurritoクラスのゲッターに呼び出します。例もう一度肉を使用した:上記のブリトークラスに見られるよう

def get_meat(self): 
     return self.meat.get_value() 

同じことが、米と豆のクラスに適用されます。

好奇心心のために、これはそれをテストする少しの方法であります

newburrito = Burrito("pork", True, "brown", "pinto", True, True) 
print (newburrito.meat.get_value()) 

文法上の誤りについて再度お詫び申し上げます。私の説明が十分明確であることを願っています。 私は私の質問をしていたときに私が掲示した選択コードに対して明確にするために私のコード全体を投稿することを決めました。

関連する問題