Найти - Пользователи
Полная версия: Критика, советы и поиск недочетов.
Начало » Центр помощи » Критика, советы и поиск недочетов.
1 2
kriofag
Недавно начал учить питон, не совсем понимаю, как оформлять класс и его методы. Написал класс, содержащий структуру словаря для записи в базу, функции ввода и вывода(чисто формальный вывод, пока без записи в файл или в список, но показывающий, что и где лежит), необходимо мнение по оформлению кода и реализации, в частности меня интересует, правильно ли я использую self, или же злоупотребляю.
Пример кода:

class human:
        def __init__(self):
                self.d =  {'name': {'first': '', 'last': ''},
                     'age': '', 
                     'adress': {'home': '', 'street': '', 'town': ''}
                     }
                self.f = list()
        
        
        def setData(self):                                                    
                self.d['name']['first'] = input('Введите имя:     ')
                self.d['name']['last']  = input('Введите фамилию:     ')
                self.d['age'] = input('Введите возраст:     ')
                self.f = input('Введите адрес:     ')      # в формате <город улица дом> через пробел
                self.f = self.f.split(' ')
                self.d['adress']['town']   = self.f[0]
                self.d['adress']['street'] = self.f[1]
                self.d['adress']['home']   = self.f[2]
                return 0
        def getData(self):
                print(self.d.keys())
                print(self.d.values())
newHuman = human()
newHuman.setData()
newHuman.getData()

Rodegast
Зачем создавать словари в классе? Делай так:
class human:
    def __init__(self):
        self.first_name = ""
        self.last_name = ""
        self.age = 0
        self.adress = {'home': '', 'street': '', 'town': ''}
    def setAge(self, age):
        self.age=age
newHuman = human()
newHuman.setAge(input('Введите возраст:     '))
J.R.
.
kriofag
Rodegast
Зачем создавать словари в классе? Делай так:
Возможно, так даже и лучше, просто не привык к не жесткому заданию класса)

J.R.
За пример ввода данных и всей структуры огромное спасибо)
py.user.next
J.R.
Как-то так может быть:
Если класс расчитан на хранение информации, то вводить он ничего не должен. (Методы должны быть чистыми функциями.)
Предположим, что данные поступают не с потока ввода (stdin), а из сокета по сети. Тот класс, который вводит из потока ввода (stdin), невозможно использовать.
Вот так тебе нужно писать новый класс, когда нужно использовать тот, что уже написан.
J.R.
.
py.user.next
J.R.
наследуем, и переписываем дандеринит, с учётом источника данных, при этом сохраняя структуру данных.
Что мешает вообще не писать там ввод?

>>> class Human:
...     def __init__(self, name, lastname):
...         self.name = name
...         self.lastname = lastname
...     def __repr__(self):
...         return 'H({}, {})'.format(self.name, self.lastname)
... 
>>> def human_from_string(s):
...     return Human(*s.split(None, 1))
... 
>>> def human_from_input():
...     name = input('Name: ')
...     lastname = input('Lastname: ')
...     return Human(name, lastname)
... 
>>> 
>>> h1 = human_from_string('John Doe')
>>> h2 = human_from_input()
Name: Jane
Lastname: Roe
>>> h1, h2
(H(John, Doe), H(Jane, Roe))
>>>
J.R.
.
py.user.next
J.R.
Есть одна задача с рабочим кодом. Код учебный. Нужно покритиковать
Выкладывай на https://gist.github.com/
J.R.
.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB