Arume
Arume

Reputation: 28

How can I use property functions in methods in python?

I tried writing Code 2 to do the same thing as Code 1. But, Code 2 did not work. Why? How can I use property functions in methods in python?

(Code 1)

class Spam:
    def __init__(self, is_less_sodium):
        self.__is_less_sodium = is_less_sodium

    def __getter(self):
        return self.__is_less_sodium

    is_less_sodium = property(__getter)

my_spam = Spam(False)
print(my_spam.is_less_sodium)

########## Result ##########
# False

(Code 2)

class Spam:
    def __init__(self, is_less_sodium):
        self.__is_less_sodium = is_less_sodium
        Spam.is_less_sodium = property(self.__getter)

    def __getter(self):
        return self.__is_less_sodium

my_spam = Spam(False)
print(my_spam.is_less_sodium)

########## Result ##########
# Traceback (most recent call last):
#   File "code2.py", line 10, in <module>
#     print(my_spam.is_less_sodium)
# TypeError: __getter() takes 1 positional argument but 2 were given

I understood that the return value of property(__getter) is assigned to is_less_sodium, which is a class variable of Spam, in Code 1. But, this understanding seems wrong.

Upvotes: 0

Views: 64

Answers (2)

1data0
1data0

Reputation: 131

class Spam:
    def __init__(self, is_less_sodium):
        self.__is_less_sodium = is_less_sodium
        Spam.is_less_sodium = property(Spam.__getter,)

    def __getter(self):
        return self.__is_less_sodium

my_spam = Spam(False)
print(my_spam.is_less_sodium)

You can use that syntax but you also have to reference the function from the class level not the instance function.

The decorator syntax is much cleaner.

class Spam:
    def __init__(self, is_less_sodium):
        self.__is_less_sodium = is_less_sodium

    @property
    def is_less_sodium(self):
        return self.__is_less_sodium

    @is_less_sodium.setter
    def set_is_less_sodium(self):
        self.__is_less_sodium

my_spam = Spam(False)
print(my_spam.is_less_sodium)
my_spam.is_less_sodium = True
print(my_spam.is_less_sodium)

Upvotes: 2

hotoku
hotoku

Reputation: 141

In code1, property is used as property(__getter). In this code, __getter accepts 1 argument self.

In code2, property is used as property(self.__getter). In this code, self.__getter accepts no argument.

In use case of code2, my_spam.is_less_sodium will result my_spam.__getter(my_spam).

This is the cause of error message __getter() takes 1 positional argument but 2 were given

Upvotes: 0

Related Questions