Найти - Пользователи
Полная версия: Помогите разобраться с классами и функциями
Начало » Python для новичков » Помогите разобраться с классами и функциями
1 2 3
Ed
macgera
И еще вопрос, по поводу моего кода по классу, ткните на ошибки, кроме “прибить гвоздями вывод”. или вполне сносный код?
Код не сносный, а банально нерабочий. Вы просто слили все функции под class sales и все.
К тому же я не уверен, что вам реально нужны функции типа print_dates, которая выводит одни даты без привязки к остальным полям. Какой смысл в этом выводе. Разве что это только для попрактиковаться. Даже в этом случае нужны какие-то осмысленные задачи.
macgera
Понял.. продолжу тему после очередного прочтение книги =) Раздела о классах

А вообще конечно это все попрактиковаться.. я же говорю осваиваю Пайтон… просто некоторые моменты оч сложные по книжным примерам…
macgera
Вообщем получилось так у меня вывод зарплаты как бы..

#!/usr/bin/env python
# coding: utf-8

class Sales: # Имя класса
def set_Data(self, name, baseName, percent): # присваиваю классу переменные, что бы потом с ними работать
self.name = name
self.baseName = baseName
self.percent = percent

def get_data(self):
return [dict(zip(("date", "product", "price"), line.split())) for line in open(self.baseName)]

def get_pay(self): #считаю процент от продаж.. к примеру зарплата
all_sales = sum([float(item["price"]) for item in data])
payment = all_sales / 100 * float(self.percent)
print self.name, 'get money =', payment


Dima = Sales()
Dima.set_Data('Dima', 'Dima.txt', '15')
data = Dima.get_data()

Anton = Sales()
Anton.set_Data('Anton', 'Anton.txt', '12')
data = Anton.get_data()


Anton.get_pay()

Dima.get_pay()
Но тут как-то криво получаеться что нужно много прописывать…

Anton = Sales() #привязка к классу
Anton.set_Data('Anton', 'Anton.txt', '12') #задание переменных
data = Anton.get_data() # вывод нужного
Я так понимаю что бы избежать этого и выводить просто так

Anton = Sales('Anton', 'Anton.txt', '12') #привязка к классу и задание переменных
data = Anton.get_data() #
Anton.get_pay()
Нужно использовать функцию __init__(self, …, …, …): или я где-то ошибаюсь?

блин попробовал и все заработало.. =)

P.S. модераторы не потерайте темку по возможности.. мало ли кому нить пригодиться.. какому нибудь типа меня.
Ed
Так покажите окончательный вариант, может чего присоветуем.
macgera
Вот и есть конечный вариант одной из части поставленной перед собой задачи. А основная задача такая:
Вводишь имя продавца, и создается файл базы на него, другая программа берет данные из базы продуктов и и записывает продажу в файл нужного продавца, третья программа считает зарплату. То есть это я так учусь.. сам придумываю задачи. Выполняю все в терминале, PyGTK не освоил, а Windows не пользуюсь.

Окончательный вариант такой:

#!/usr/bin/env python
# coding: utf-8

class Sales: # Имя класса
def __init__(self, name, baseName, percent): # присваиваю классу переменные, что бы потом с ними работать
self.name = name
self.baseName = baseName
self.percent = percent

def get_data(self):
return [dict(zip(("date", "product", "price"), line.split())) for line in open(self.baseName)]

def get_pay(self): #считаю процент от продаж.. к примеру зарплата
all_sales = sum([float(item["price"]) for item in data])
payment = all_sales / 100 * float(self.percent)
print self.name, 'get money ---->', payment, '$'



Dima = Sales('Dima Shvets', 'Dima.txt', '5')
data = Dima.get_data()
Dima.get_pay()

Anton = Sales('Anton Krots', 'Anton.txt', '5')
data = Anton.get_data()
Anton.get_pay()
Вот он и есть конечный вариант одной из части поставленной перед собой задачи.

По сути присоветовать можно было бы.. мне не совсем нравиться что переменную data нужно объявлять в коде а не классе. Просто get_data хорош тем что я могу дописать дополнительные функции к данным словаря.. например вывести список проданных продуктов.. Я же смог избавиться от объявления переменной data только способ создания функции

class Sales: # Имя класса
def __init__(self, name, baseName, percent): # присваиваю классу переменные, что бы потом с ними работать
self.name = name
self.baseName = baseName
self.percent = percent

def get_pay(self):
data = [dict(zip(("date", "product", "price"), line.split())) for line in open(self.baseName)]
all_sales = sum([float(item["price"]) for item in data])
payment = all_sales / 100 * float(self.percent)
print self.name, 'Получит денег ---->', payment, '$'
Но в таком случае то если мне понадобятся другие данные из словаря, мне нужно будет его заново создавать в новой функции… Вот как бы в моем классе с 2-мя функциями объявить переменную data внутри класса

P.S. еще не плохо было бы использовать базу данных типа anydb но в книге сказано что такое есть.. а как пользоваться нефига не сказано, подскажите в какую сторону Googl-опатой рыть?
Ed
Попробуйте создать data в __init__, вернее это будет self.data.
А в функциях типа get_pay просто обрабатывайте self.data.
macgera
Думал что все переменные в __init__ обязательно должны быть в аргументах…

Теперь вот так вот замечательно все получилось! Спасибо! Хороший опыт и знания получил!

#!/usr/bin/env python
# coding: utf-8

class Sales: # Имя класса
def __init__(self, name, baseName, percent): # присваиваю классу переменные, что бы потом с ними работать
self.name = name
self.baseName = baseName
self.percent = percent
self.data = [dict(zip(('date', 'product', 'price'), line.split())) for line in open(self.baseName)]

def get_sale(self):
for item in self.data:
print item['product'], item['price'], '$'

def get_pay(self): #считаю процент от продаж.. к примеру зарплата
all_sales = sum([float(item["price"]) for item in self.data])
payment = all_sales / 100 * float(self.percent)
print self.name, 'Получит денег ---->', payment, '$'

Dima = Sales('Дмиртрий Лохушевцев', 'Dima.txt', '5')
Anton = Sales('Антон Якименко', 'Anton.txt', '5')

Dima.get_pay()
Dima.get_sale()
print '\n'
Anton.get_pay()
Anton.get_sale()
Ed
Я бы все-таки попробовал бы вынести вывод из класса.
Что-нибудь типа такого:
dima = Sales('Дмиртрий Лохушевцев', 'Dima.txt', '5')
print dima.name, 'Получит денег ---->', dima.get_pay(), '$'
Такая схема позволит выводить куда угодно, не меняя класс Sales.
Либо, если так хочется держать вывод в классе, то попробуйте выделить методы вывода. Тогда по крайней мере можно будет пронаследоваться и переопределить их в наследнике, если нужно выводить по-другому.
macgera
Сегодня поиграю с выводами.. Просто в первую очередь думал о том что бы все работало =)

Кстати попробовал так

    def get_sale(self): #показываю все продажи
for item in self.data:
return item['product']
А в теле вывод

Dima = Sales('Дмиртрий Лохушевцев', 'Dima.txt', '5')
Dima.get_sale()
То выдает один продукт первый в списке…

а так

    def get_sale(self): #показываю все продажи
for item in self.data:
print item['product']
Выдает весь список.
Ed
Правильно. Потому что print не прерывает работу функции, а return заканчивает ее, выходит из нее. Поэтому так и назван.
У этой проблемы как минимум 2 решения: возвращать список, либо сделать этот метод генератором. Попробуйте оба, выберите чего больше понравится.
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