Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

python oop class attribute returns None when set

I’m trying to learn object orientated programming and when setting an attribute why does it return None?

Any tips on writing better code also appreciated… This is my class:

BEANS = ["black", "pinto"]
RICES = ["brown", "white"]
MEATS = ["chicken", "pork", "steak", "tofu"]


class Burrito:

    def __init__(self,
                meat,
                to_go,
                rice,
                beans,
                extra_meat=False,
                guacamole=False,
                cheese=False,
                pico=False,
                corn=False
                ):

        self.meat = self.setter("meat",meat)
        self.rice = self.setter("rice",rice)
        self.beans = self.setter("beans",beans)
        self.to_go = False
        self.extra_meat = False
        self.guacamole = False
        self.cheese = False
        self.pico = False
        self.corn = False

    def setter(self,category,attribute):

        print("category: ",category)
        print("attribute: ",attribute)

        if category == "meat":
            
            if attribute in MEATS:
                self.meat = attribute
            else:
                self.meat = False

        if category == "rice":
            
            if attribute in RICES:
                self.rice = attribute
            else:
                self.rice = False

        if category == "beans":
            
            if attribute in BEANS:
                self.beans = attribute

            else:
                self.beans = False
                
        else:
            self.category = "Error"

When I run this I expected the print to be False but returning None

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

noodle_burrito = Burrito("spagetti", True, True, False)
print("noodle_burrito.meat: ",noodle_burrito.meat)

And when I run this I expected the print to be tofu but returning None

vegg_burrito = Burrito("tofu", True, True, False)
print("vegg_burrito.meat: ",vegg_burrito.meat)

Thanks for any learning tips! Trying to reference this other SO post but I have never used super before.

>Solution :

Any function that doesn’t explicitly return anything implicitly returns None.

Your setter function internally sets things, but has no other return statement, so

self.meat = self.setter("meat",meat)

ends up setting self.meat to None right after self.setter has already set it to something.

You’re also not doing anything with more than half of the parameters your constructor accepts. I would write your class as

BEANS = {"black", "pinto"}
RICES = {"brown", "white"}
MEATS = {"chicken", "pork", "steak", "tofu"}


def validate_attr(value, options):
    if value in options:
        return value
    return False


class Burrito:
    def __init__(
        self,
        *,
        meat,
        rice,
        beans,
        to_go,
        extra_meat=False,
        guacamole=False,
        cheese=False,
        pico=False,
        corn=False,
    ):
        self.meat = validate_attr(meat, MEATS)
        self.rice = validate_attr(rice, RICES)
        self.beans = validate_attr(beans, BEANS)
        self.to_go = bool(to_go)
        self.extra_meat = bool(extra_meat)
        self.guacamole = bool(guacamole)
        self.cheese = bool(cheese)
        self.pico = bool(pico)
        self.corn = bool(corn)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading