LINUX.ORG.RU

Не могу понять, зачем нужна геттеры?

 , ,


0

2

class Person:
    
    __address = "n/a"
    __name = "n/a"
    __age = 0
    
    def set_name(self, n):
        self.__name = n
        
    def get_name(self):
        return self.__name
    
    def set_age(self, a):
        self.__age = a
        
    def get_age(self):
        return self.__age
    
    def set_address(self, a):
        self.__address = a
    
    def get_address(self):
        return self.__address

    def description_of_person(self):
        print("---------------------")
        print("| My name is ", self.__name)
        print("| I'm ", self.__age ,"years old.")
        print("| My address is ",self.__address)
        
person1 = Person()
person2 = Person()

person1.set_name('John')
person1.set_age(23)
person1.set_address('dom 13')

person2.set_name('Mike')
person2.set_age(16)
person2.set_address('dom 5')

person1.description_of_person()
person2.description_of_person()

Если убрать здесь все геттеры, это не повлияет на результат. Так к чему они?



Последнее исправление: beastie (всего исправлений: 3)

ООП! Инкапсуляция! Полиморфизм! Вот за этим всем. Конкретно в твоем синтетическом примере, который не будет развиваться, меняться и т.д. смысла нет.

pi11 ★★★★★
()

Ты имеешь в виду, что в крестах нельзя так делать, так почему же можно в питоне?

zolden ★★★★★
()

В твоем примере, смысла в геттерах нет.

tailgunner ★★★★★
()

Например, нужны когда нет аналогичного set метода. Конкретно в твоём примере вообще было бы достаточно обычного класса со всеми публичными полями и мб даже с использованием __slots__

mashina ★★★★★
()
fut.add_done_callback(functools.partial(obj.set_status, DONE))
redixin ★★★★
()
Ответ на: комментарий от kramh

Ну например если твои геттеры/сеттеры обращаются к бд и в зависимости от бд выполняется разный код. Или например, если другие данные должны меняться при изменении одного из полей, или например если getter должен что-то расчитывать и т.д. и т.п.

pi11 ★★★★★
()
ass DateOffset:
    def __init__(self):
        self.start = 0
    
    def _get_offset(self):
        self.start +=  5
        return self.start 

    offset = property(_get_offset)


>>> d = DateOffset()
>>> d.offset
5
>>> d.offset
10

Вот тут показана работа геттера. Легко

kramh
() автор топика
Ответ на: комментарий от pi11

В общем, просто использовать геттер для какой-то работы/преобразования и, наконец, вывода

kramh
() автор топика
Ответ на: комментарий от kramh

Можно, пожалуйста, пример

Можно завести поле «день рождения», a вот «age» вычислять в геттере как «now - день рождения».

superuser ★★★★☆
()
Ответ на: комментарий от kramh

Вот тут показана работа геттера. Легко

Это уже не getter, а просто метод. Геттер должен быть реентерабельным, т.е. максимум может ходить куда-то за значением с последующим кешированием или считать один раз запоминая результат.

mashina ★★★★★
()
Ответ на: комментарий от kramh

font/set_font, причем если фонт не установлен, то возвращается дефолтный, например. А при установке проверяется: если другой, то text_control.update_text(), например.

arturpub ★★
()
Ответ на: комментарий от kramh

Свойства, проперти, не «лишь декоратор». Поищи пример, реализующий свойства на pure python, без сахара.

Virtuos86 ★★★★★
()
Ответ на: комментарий от kramh

Вот тут показана работа геттера. Легко

Анонимус что ль?

ya-betmen ★★★★★
()
class Document
{
    public title = '';

    function getTitle(default = 'Untitled')
    {
        return !empty(title) ? title : default;
    }
}
kiotoze ★★★★
()
Ответ на: комментарий от zolden

Ты имеешь в виду, что в крестах нельзя так делать, так почему же можно в питоне?

А что именно в коде у ТС нельзя сделать на крестах?

anonymous
()
Ответ на: комментарий от zolden

Получить доступ к приватным атрибутам без геттера?

А разве это есть у ТС? Или ты имеешь в виду, что оставить только сеттер? Ну так в С++ будет точно так же.

anonymous
()
Ответ на: комментарий от pi11

ООП! Инкапсуляция

python

Инкапсуляция

python

Инкапсуляция

python

ПФФФФФХАХАХАХХАХАХАХХАХАХ!

comp00 ★★★★
()
Ответ на: комментарий от zolden
x = Person()
x._Person__name = "xyz"
x._Person__name
'xyz'

да это плохо и убого, но это возможность языка. Который, кстати, претендует на нишу ООП. Срамота!

comp00 ★★★★
()
Последнее исправление: comp00 (всего исправлений: 2)

геттеры нужны для увеличения непредсказуемости кода

Debasher ★★★★★
()
Ответ на: комментарий от zolden

Это с двойным подчеркиванием которые?

kramh
() автор топика
Ответ на: комментарий от buddhist

Кому должен?

Не тем словом обозвал, идемпотентным должен быть. Мог бы догадаться что подразумевалось.

mashina ★★★★★
()
Ответ на: комментарий от kramh

Можно изпользовать геттеры для логирования доступа к свойствам. Для кэширования, как где-то уже говорили.

xenohunter
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.