簡體   English   中英

在 if 語句中定義類的方法

[英]defining method of class in if statement

我正在嘗試創建一個類,該類將根據輸入創建具有不同方法的對象。 這樣做的目的是避免每次調用方法時都使用 if 語句。

下面是我認為可以工作但不工作的代碼。

class Food:
    def __init__(self,food_type):
        self.food_type = food_type

        if food_type == 'cookie':
            print 'this is a cookie'
            def is_awesome(self):
                print "is awesome"
        else:
            print 'this is not a cookie'
            def is_awesome(self):
                print "not awesome"

Oreo = Food('cookie')
Oreo.is_awesome()

代碼在def is_awesome(self)語句上沒有錯誤,而是Oreo.is_awesome()行引發了錯誤:

“AttributeError: Food 實例沒有屬性 is_awesome”。

有沒有更好的方法來制作具有不同方法的對象? ,是有原因的方法is_awesome是不是“Oreo.is_awesome”贖回?

你必須定義方法/函數is_awesome(self)然后你的if's里面

class Food:
    def __init__(self,food_type):
        self.food_type = food_type

    def is_awesome(self):
         if self.food_type == 'cookie':
            print 'this is a cookie'
            print "is awesome"
         else:
            print 'this is not a cookie not awesome'
            print "not awesome"


Oreo = Food('cookie')
Oreo.is_awesome()

這有效,經過測試!

有沒有更好的方法來制作具有不同方法的對象?

是的,一種有效的方式:) 多態性是一個很好的候選者。

class Food:
  def is_awesome(self):
    print 'not awesome'

class Cookie(Food):
  def is_awesome(self):
    print 'is awesome'

是否有理由無法通過“Oreo.is_awesome”調用 is_awesome 方法?

是的,它不綁定到任何實例(通常稱為self

我遇到了類似的情況,我希望一個類的不同實例讓其中一個方法根據 init 值表現出不同的行為,但仍然具有相同的方法名稱,並且不想在每次調用時運行 if/else 語句方法。

我找到的最簡單的解決方案是定義一個 setter 方法,該方法創建一個指向所需行為的指針,並且這個 setter 方法僅在初始化時運行一次:

class Food:
    def __init__(self, food_type):
        self.food_type = food_type
        
        self.set_awesomeness()
    
    def is_awesome():
        return 'is awesome'

    def not_awesome():
        return 'not awesome'

    # Point to the wanted behavior
    def set_awesomeness(self):
        if self.food_type == 'cookie':
            self.awesomeness = Food.is_awesome()
        else:
            self.awesomeness = Food.not_awesome()

    def get_awesomeness(self):
        return self.awesomeness
    
cookie = Food('cookie')
cookie.get_awesomeness() # 'is awesome'

donut = Food('donut')
donut.get_awesomeness() # 'not awesome'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM