- Геттеры и сеттеры в Python – что нужно знать
- Что такое геттер в Python?
- Что такое сеттер в Python?
- Использование обычной функции для выполнения функций геттеров и сеттеров
- Использование функции property() в качестве геттеров и сеттеров
- Использование декораторов @property
- Делаем атрибуты приватными
- Чтение значений из частных методов
- Can I use a class method to set attributes of the class in Python?
- 1 Answer 1
Геттеры и сеттеры в Python – что нужно знать
Геттеры и сеттеры в Python отличаются от методов в других языках ООП. Основное использование методов получения и установки – обеспечение инкапсуляции данных в объектно-ориентированных программах. В отличие от других объектно-ориентированных языков, частные переменные в Python не являются скрытыми полями. Некоторые языки ООП используют методы получения и установки для инкапсуляции данных. Мы хотим скрыть атрибуты класса объекта от других классов, чтобы методы других классов случайно не изменили данные.
В языках ООП геттеры и сеттеры используются для извлечения и обновления данных. Метод получения извлекает текущее значение атрибута объекта, тогда как средство установки изменяет значение атрибута объекта. В этой статье мы собираемся обсудить геттер и сеттер в Python с примерами.
Что такое геттер в Python?
Геттеры (получатели) в Python – это методы, которые используются в объектно-ориентированном программировании (ООП) для доступа к частным атрибутам класса. Функция setattr() в Python согласовывается с функцией getattr() в Python. Она изменяет значения атрибутов объекта.
Что такое сеттер в Python?
Сеттер (установщик) в Python – это метод, который используется для установки значения свойства. В объектно-ориентированном программировании очень полезно устанавливать значение частных атрибутов в классе.
Как правило, геттеры и сеттеры в основном используются для обеспечения инкапсуляции данных в ООП.
Использование обычной функции для выполнения функций геттеров и сеттеров
Не будет специальной реализации, если мы укажем обычные методы get() и set() для достижения свойства getters и setters.
Давайте рассмотрим пример, чтобы понять, как мы можем использовать обычную функцию для получения функций получения и установки.
class Javatpoint: def __init__(self, age = 0): self._age = age # using the getter method def get_age(self): return self._age # using the setter method def set_age(self, a): self._age = a John = Javatpoint() #using the setter function John.set_age(19) # using the getter function print(John.get_age()) print(John._age)
После выполнения этого кода мы получим вывод, как показано ниже:
Для достижения такой функциональности методы get age() и set age() в приведенном выше коде работают как стандартные функции и не влияют на методы получения и установки. Python имеет уникальное свойство функции().
Использование функции property() в качестве геттеров и сеттеров
В Python property() является встроенной функцией для создания и возврата свойства объекта. Есть три метода: getter(), setter() и delete(). В Python функция property() принимает четыре аргумента: свойства (fget, fset, fdel, doc). Функция fget используется для получения значения атрибута. Функция fset используется для установки значения атрибута. Функция fdel используется для удаления значения атрибута. Атрибуту присваивается строка документации doc.
Давайте рассмотрим пример, чтобы понять, как мы можем использовать функцию property() для достижения поведения геттеров и сеттеров.
class Javatpoint: def __init__(self): self._age = 0 # using the get function def get_age(self): print("getter method") return self._age # using the set function def set_age(self, y): print("setter method") self._age = y # using the del function def del_age(self): del self._age age = property(get_age, set_age, del_age) John = Javatpoint() John.age = 18 print(John.age)
Вывод: после выполнения этого кода выше мы получим вывод, как показано ниже:
setter method getter method 18
В приведенной выше программе есть только один оператор печати. Выходные данные состоят из трех строк из-за вызываемого метода установки set age() и getter метода get age(). В результате возраст – это объект свойства, который помогает обеспечить безопасность доступа к частным переменным.
Использование декораторов @property
Мы использовали функцию property() в предыдущем методе для достижения поведения геттеров и сеттеров. Однако, как упоминалось ранее в этой статье, геттеры и сеттеры также используются для проверки получения и установки значений атрибутов.
Другой метод принудительного выполнения функции свойства – использование декоратора. @property – один из встроенных декораторов Python. Основная цель любого декоратора – изменить методы или атрибуты класса, чтобы пользователю класса не нужно было изменять свой код.
Давайте рассмотрим пример, чтобы понять, как мы можем использовать декораторы @property для достижения поведения геттеров и сеттеров.
class Javatpoint: def __init__(self): self._age = 0 # using the getter function @property def age(self): print("getter method") return self._age #now, using the setter function @age.setter def age(self, x): if(x < 20): raise ValueError("the age is below eligibility criteria") print("setter method") self._age = x John = Javatpoint() John.age = 25 print(John.age)
setter method called getter method called 25
В приведенном выше коде показано, как использовать декоратор @property для создания методов получения и установки. Приведенный выше пример служит кодом проверки, вызывающим ошибку ValueError, если мы пытаемся инициализировать age со значением меньше 20.
Делаем атрибуты приватными
Теперь мы увидим, как сделать методы закрытыми, чтобы внешние вызывающие функции не могли манипулировать переменными внутри них. Ими можно управлять только с помощью функций, определенных в классе. Они становятся закрытыми, если ставить перед ними два символа подчеркивания.
Давайте рассмотрим пример, чтобы понять, как мы можем сделать атрибуты закрытыми в программе.
class Javatpoint: def __init__(self, age=49): self._age = age # make the getter method def get_age(self): return self.__age # make the setter method def set_age(self, a): self.__age = a grad_obj = Javatpoint() print(grad_obj._age) # Before using setter print(grad_obj.get_age()) # After using setter grad_obj.set_age(2020) print(grad_obj._age)
Вывод: после выполнения этого кода выше мы получим вывод, как показано ниже:
Чтение значений из частных методов
Чтобы прочитать значение из частных методов, мы должны использовать метод получения. Без использования метода получения мы не можем использовать метод свойств для доступа к значениям частных атрибутов. Давайте рассмотрим пример, чтобы понять этот метод.
# A program to read the value from private method class Javatpoint: def __init__(self, year=27): self._year = year @property def Aboutyear(self): return self.__year @Aboutyear.setter def Aboutyear(self, x): self.__year = x grad_obj = Javatpoint() print(grad_obj._year) grad_obj.year = 2020 print(grad_obj.year)
Возьмем еще один пример создания класса со свойствами. Из этого класса мы возьмем несколько объектов.
class Javatpoint: def __init__(self): self.emp = "None" Mark = Friend() John = Friend()
Для этих объектов свойство (Emp) не задано. Мы могли бы установить его напрямую, но это не лучший метод. Вместо этого мы создаем два метода: getEmp() и setEmp().
class Javatpoint: def __init__(self): self.emp = "None" def getEmp(self): return self.emp def setEmp(self, emp): self.emp = emp Mark = Javatpoint() John = Javatpoint() Mark.setEmp("Developer") John.setEmp("Designer") print(John.emp) print(Mark.emp)
Can I use a class method to set attributes of the class in Python?
I have a class with certain attributes. I would like to define a method which sets other attributes based on the ones that have already been set. Something like this:
class Test: def __init__(self, name): self.name = name self.list = [] max = None def get_max(self) self.max = max(list)
This doesn't work. I have a feeling I am doing something very wrong but I can't work out what. Please someone put me out of my misery. Updated code gives me an Attribute error:
class Test: def __init__(self, name): self.name = name self.lst = [] self.mx = None def get_max(self) self.mx = max(self.lst)
>>>t = Test('testname') >>>t.lst = [1,2,3] >>>t.get_max >>>t.name 'testname' >>>t.lst [1,2,3] >>>t.mx AttributeError: Test instance has no attribute 'mx'
When you say "This doesn't work" what do you mean? If you're getting an exception, please include the full traceback in your question.
Apologies for sloppily written code in original question. Hopefully the edited question clears up a bit what I want to do
Luke: this might be a typo or an edit artifact, but to call t.get_max,you need to do t.get_max() (unlike in e.g. ruby)
1 Answer 1
It would be self.list to refer to the attribute, list is referring to the python builtin list.
You would need to do something like:
class Test: def __init__(self, name,lst): self.name = name self.lst = lst self.mx = None # use self to create an attribute def get_max(self): self.mx = max(self.lst)
You can also simply just call max on the list whenever you want to get the max , you don't need to create an attribute and method simply to return or get the max of the list.
You should simply return the max of the list in the method if you really wanted to use a method to get the max:
class Test: def __init__(self, name, lst): self.name = name self.lst = lst def get_max(self): return max(self.lst) t = Test("foo", [1,2,3,4]) print(t.get_max()) 4
The design of your class really depends on what exactly you want to do in it but you don't getters or setters in python.
If you want to do something based on the max element in the list you don't need an attribute:
class Test: def __init__(self, name,lst): self.name = name self.lst = lst def some_meth(self): if max(self.lst) > 2: # do something