Reputation: 28
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
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
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