Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
1

Проверка выполнения задания на классы

07.01.2014, 14:46. Просмотров 1049. Ответов 11
Метки нет (Все метки)

Вообщем разбираюсь с классами и вот есть такое задание:
"Разработать класс, описывающий некоторый физический материал( вещество).
Поля: имя, плотность.
Конструкторы: по умолчанию; с параметрами.
Методы:
getters/setters;
ToString() – значения полей объекта в csv формат.
Пример:
steel;7850

Разработать класс, описывающий однородный предмет, состоящий из одного материала.
Поля: имя, материал (класс, разработанный выше), объём.
Конструкторы: по умолчанию; с параметрами.
Методы:
getters/setters;
GetMass() – вычисление массы предмета (= плотность * объём);
ToString() – объект в строку в csv формате.
Пример:
wire;steel;7850;0.03;235.5

В методе Main(…) консольного приложения сделать следующее:
1.Создать объект Стальной_Провод из стали в объёме 0.03м3.
2.Вывести объект на консоль с использованием ToString().
3.Изменить материал провода на медь (плотность = 8500) и вывести на консоль его новую массу."
вот код, который я написал. Вроде сделал правильно, но хотелось бы услышать стороннее мнение, побольше критики так сказать.
использую python 2.7.3
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""It is the program for description of a physical material (substance)"""
 
class Material:
    """Class Material describes a material.
        Method __init__ accept two parametrs: name and density.
        Methods gets  return value of attribute, sets - accept new value of attribute. 
        Method ToString output values of fields in csv format."""
    def __init__(self, nameMaterial="Default",density=3940):
        self.__nameMaterial = nameMaterial
        self.__densityOfMaterial = density
 
    def getNameMaterial(self):
        return self.__nameMaterial
 
    def getDensityOfMaterial(self):
        return self.__densityOfMaterial
 
    def setNameMaterial(self, x):
        self.__nameMaterial = x;
 
    def setDensityOfMaterial(self, x):
        self.__densityOfMaterial = x
 
    def ToString(self):
        print str(self.__nameMaterial) + ";" + str(self.__densityOfMaterial)
 
class UniformMaterial(Material):
    """Class UniformMaterial is intended for description uniform object 
    consisting of a single material. Method __init__ accept four
     parametrs: name of material, density of material, name of object,
      volume of object. Method GetMass calculates weight of object """
    def __init__(self, nameMaterial = "Default", density = 3940,
        nameStuff = "Default",volume = 15):
        Material.__init__(self, nameMaterial, density)
        self.__nameUniformMaterial = nameStuff
        self.__volumeUniformMaterial = volume
 
    def getVolumeUniformMaterial(self):
        return self.__volumeUniformMaterial
 
    def setVolumeUniformMaterial(self,x):
        self.__volumeUniformMaterial = x
 
    def getNameUniformMaterial(self):
        return self.__nameUniformMaterial
 
    def setNameUniformMaterial(self,x):
        self.__nameUniformMaterial = x
 
    def GetMass(self):
        self.__weightUniformMaterial = self.getVolumeUniformMaterial() * \
        self.getDensityOfMaterial()
        return self.__weightUniformMaterial      
        
    def ToString(self):
        print str(self.getNameUniformMaterial())+";"+str(self.getNameMaterial())+\
        ";"+str(self.getDensityOfMaterial())+";"+\
        str(self.getVolumeUniformMaterial())+";"+str(self.GetMass())
 
Steel_Wire = UniformMaterial( nameStuff = "wire", nameMaterial = "steel",
 volume = 0.03)
Steel_Wire.ToString()
Steel_Wire.setNameMaterial("copper")
Steel_Wire.setDensityOfMaterial(8500)
print Steel_Wire.GetMass()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2014, 14:46
Ответы с готовыми решениями:

Проверка задания на логические операции на верность выполнения
Можете написать код для решения следующей задачи: на ассемблере с Intel'овским синтаксисом через...

Проверка наличия задания и назначение задания
Вопрос как зделать так чтоби ето задания после повторно запуска *.bat проверяло существует ли даное...

Проверить правильность выполнения задания
формула : y'=0.133(x^2+sin2.1x)+0.872y вот код: Private Sub CommandButtonl_Click() Dim x, x1,...

Ошибка выполнения регламентного задания
Ошибка такая: “Поле объекта не обнаружено (ОбщиеЗначения)” При этом регламентное задание...

11
139 / 139 / 38
Регистрация: 20.02.2012
Сообщений: 597
08.01.2014, 09:09 2
1. посмотри ещё такую штуку как property, может его где нибудь заюзаешь в классах.
2. ещё, я бы дописал какие то проверки значении в сеттереах. например типы полей. str, int
3. ещё предлагаю писать new_style классы и использовать функцию super
1
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
08.01.2014, 18:58  [ТС] 3
ilnurgi, переделал с учетом ваших предложений. Честно говоря до конца работу декораторов не осознал хоть их и использовал, но нашел пару статей где разжевывают, надо просто перечитать пару раз.
Переработанный код:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""It is the program for description of a physical material (substance)"""
 
__metaclass__ = type
 
class Material:
    """Class Material describes a material.
        Method __init__ accept two parametrs: name and density.
        Methods gets  return value of attribute, sets - accept new value of attribute. 
        Method ToString output values of fields in csv format."""
    def __init__(self, nameMaterial="Default",density=3940):
        if type(nameMaterial) == str:
            self.__nameMaterial = nameMaterial
        else: print "Incorrect input 'nameMaterial' "
        if type(density) == int:
            self.__densityOfMaterial = density
        else: print "Incorrect input 'density' "
 
    @property
    def nameMaterial(self):
        return self.__nameMaterial
 
    @nameMaterial.setter   
    def nameMaterial(self, x):
        if type(x) == str:
            self.__nameMaterial = x;
        else: print "Incorrect input 'nameMaterial' "
        
    @property
    def densityOfMaterial(self):
        return self.__densityOfMaterial
    
    @densityOfMaterial.setter    
    def densityOfMaterial(self, x):
        if type(x) == int:
            self.__densityOfMaterial = x
        else: print "Incorrect input 'density' "
 
 
    def ToString(self):
        print ";".join([str(self.nameMaterial), str(self.densityOfMaterial)])
 
class UniformMaterial(Material):
    """Class UniformMaterial is intended for description uniform object 
    consisting of a single material. Method __init__ accept four
     parametrs: name of material, density of material, name of object,
      volume of object. Method GetMass calculates weight of object """
    def __init__(self, nameMaterial = "Default", density = 3940,
        nameStuff = "Default",volume = 15):
        super(UniformMaterial, self).__init__(nameMaterial, density)
        if type(nameStuff) == str:
            self.__nameUniformMaterial = nameStuff
        else: print "Incorrect input 'nameStuff' "
        if type(volume) == float:
            self.__volumeUniformMaterial = volume
        else: print "Incorrect input 'volume' "
 
    @property
    def volumeUniformMaterial(self):
        return self.__volumeUniformMaterial
 
    @volumeUniformMaterial.setter
    def volumeUniformMaterial(self,x):
        if type(x) == float:
            self.__volumeUniformMaterial = x
        else: print "Incorrect input 'volume' "
 
    @property
    def nameUniformMaterial(self):
        return self.__nameUniformMaterial
 
    @nameUniformMaterial.setter
    def nameUniformMaterial(self,x):
        if type(x) == str:
            self.__nameUniformMaterial = x
        else: print "Incorrect input 'nameStuff' "
 
    def GetMass(self):
        self.__weightUniformMaterial = self.volumeUniformMaterial * \
        self.densityOfMaterial
        return self.__weightUniformMaterial      
        
    def ToString(self):
        print ";".join([str(self.nameUniformMaterial),str(self.nameMaterial), 
            str(self.densityOfMaterial), str(self.volumeUniformMaterial),
             str(self.GetMass())])
 
Steel_Wire = UniformMaterial( nameStuff = "wire", nameMaterial = "steel",
 volume = 0.03)
Steel_Wire.ToString()
Steel_Wire.nameMaterial = "copper"
Steel_Wire.densityOfMaterial = 8500
print Steel_Wire.GetMass()
0
139 / 139 / 38
Регистрация: 20.02.2012
Сообщений: 597
09.01.2014, 07:14 4
декораторы упрощают работу:

вместо

Python
1
2
3
m = Material()
m.setNameMaterial('1')
print m.getNameMaterial()
используешь, что мне кажется красивей, проще и улучшает читабельность

Python
1
2
3
m = Material()
m.nameMaterial = '1' 
print m.nameMaterial
Добавлено через 10 минут
ещё, я бы проверял тип объекта так
Python
1
if isinstance(nameMaterial, str)
а не так:
Python
1
type(nameMaterial) == str
почему, не объясню.

и в сеттерах, когда когда проверяешь тип, я бы сделал
Python
1
raise AtributeError(u'текст сообщения')
иначе скрипт же продолжает работу, что наверное не допустимо?

и ещё, пару мыслей, как бы я сделал
Python
1
2
def ToString(self):
        print "%s;%d" %(self.nameMaterial, self.densityOfMaterial)
Python
1
2
def ToString(self):
        print "%s;%s;%d;%d;%d" % (self.nameUniformMaterial, self.nameMaterial, self.densityOfMaterial, self.volumeUniformMaterial, self.GetMass())
1
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
09.01.2014, 09:30 5
Цитата Сообщение от ilnurgi Посмотреть сообщение
декораторы упрощают работу:

используешь, что мне кажется красивей, проще и улучшает читабельность
Да вот ни разу. Декораторы облегчают решение задач, зачастую являются одним из первых средств по оптимизации, если есть таковая задача, но никак не улучшают чтение кода, особенно для новичков. Не надо извращать принцип питона как языка KISS.
Делать надо максимально читабельно, чтобы было сразу ясно по коду что и как. А декораторы, как и замыкания вообще, запутывают и количество времени, затраченное на разбор функционала в больших проектах не сравним с затратой времени на чтение простого, но от этого не менее эффективного, кода.
1
139 / 139 / 38
Регистрация: 20.02.2012
Сообщений: 597
09.01.2014, 13:33 6
fanatdebian

все что я написал, чисто мое мнение.
мне так проще.
0
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
09.01.2014, 21:18  [ТС] 7
ilnurgi, действительно спасибо. почитал на хабре про декораторы - это сильная вещь, правда чуть голову не сломал также открыл для себя исключения и структуру try, except, finally,else и raise. Применял raise как вы и советовали.
Окончательный код:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""It is the program for description of a physical material (substance)"""
 
__metaclass__ = type
 
class Material:
    """Class Material describes a material.
        Method __init__ accept two parametrs: name and density.
        Methods gets  return value of attribute, sets - accept new value of attribute. 
        Method ToString output values of fields in csv format."""
    def __init__(self, nameMaterial="Default",density=3940):
        if isinstance(nameMaterial, str):
            self.__nameMaterial = nameMaterial
        else:
            raise TypeError("Incorrect input 'nameMaterial' ")
        if isinstance(density,int):
            self.__densityOfMaterial = density
        else:
            raise TypeError("Incorrect input 'density' ")
 
    @property
    def nameMaterial(self):
        return self.__nameMaterial
 
    @nameMaterial.setter   
    def nameMaterial(self, x):
        if isinstance(x, str):
            self.__nameMaterial = x;
        else:
            raise AttributeError("Incorrect input 'nameMaterial' ")
        
    @property
    def densityOfMaterial(self):
        return self.__densityOfMaterial
    
    @densityOfMaterial.setter    
    def densityOfMaterial(self, x):
        if isinstance(x, int):
            self.__densityOfMaterial = x
        else:
            raise AttributeError("Incorrect input 'density' ")
 
 
    def ToString(self):
        print "%s;%d" % (self.nameMaterial, self.densityOfMaterial)
 
class UniformMaterial(Material):
    """Class UniformMaterial is intended for description uniform object 
    consisting of a single material. Method __init__ accept four
     parametrs: name of material, density of material, name of object,
      volume of object. Method GetMass calculates weight of object """
    def __init__(self, nameMaterial = "Default", density = 3940,
        nameStuff = "Default",volume = 15):
        super(UniformMaterial, self).__init__(nameMaterial, density)
        if isinstance(nameStuff, str):
            self.__nameUniformMaterial = nameStuff
        else:
            raise TypeError("Incorrect input 'nameStuff' ")
        if isinstance(volume, float):
            self.__volumeUniformMaterial = volume
        else:
            raise TypeError("Incorrect input 'volume' ")
 
    @property
    def volumeUniformMaterial(self):
        return self.__volumeUniformMaterial
 
    @volumeUniformMaterial.setter
    def volumeUniformMaterial(self,x):
        if isinstance(x, float):
            self.__volumeUniformMaterial = x
        else:
            raise AttributeError("Incorrect input 'volume' ")
 
    @property
    def nameUniformMaterial(self):
        return self.__nameUniformMaterial
 
    @nameUniformMaterial.setter
    def nameUniformMaterial(self,x):
        if isinstance(x, str):
            self.__nameUniformMaterial = x
        else:
            raise AttributeError("Incorrect input 'nameStuff' ")
 
    def GetMass(self):
        self.__weightUniformMaterial = self.volumeUniformMaterial * \
        self.densityOfMaterial
        return self.__weightUniformMaterial      
        
    def ToString(self):
        print "%s;%s;%d;%.2f;%.2f" %(self.nameUniformMaterial, self.nameMaterial, 
            self.densityOfMaterial, self.volumeUniformMaterial, self.GetMass())
 
Steel_Wire = UniformMaterial( nameStuff = "wire", nameMaterial = "steel",
 volume = 0.03)
Steel_Wire.ToString()
Steel_Wire.nameMaterial = "copper"
Steel_Wire.densityOfMaterial = 8500
print Steel_Wire.GetMass()
0
620 / 474 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
09.01.2014, 22:44 8
Zarex, можно место ToString взять __str__
1
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
14.01.2014, 00:23  [ТС] 9
эта задача для решения на java, я взял её у друга. Их препод прислал им замечания к задаче:
"1. В задаче нет отношения наследования между сущностями (материал и предмет). Наследование возникает, когда одна сущность является частным случаем другой. Например, жидкость (или твердое вещество) и материал. Другими словами, жидкость (как и твердое вещество) является материалом. Предмет состоит из материала, а не является материалом.
2. При использовании ООП сущности и их атрибуты именуют не абы как, а осмысленно. Часто это помогает правильно реализовать задачу.
Например, типичная ошибка – замена не материала целиком, а по отдельности замена имени и плотности.
Создадим для сравнения два экземпляра класса Material, оба соответствующих стали. Первый назовем абстрактно m, а второй осмысленно steel. Следующей операцией заменим имя на медь.
Java
1
2
3
4
5
Material m = new Material("steel", 7850);
Material steel = new Material("steel", 7850);
m.setName("copper");
steel.setName("copper");
//аналогично плотность
В первом случае как бы все и гладко. А во втором случае выглядит формально правильно, но по своей сути абсурдно. Правильный выбор имени материала steel наводит на мысль, что нужно создать еще один экземпляр класса Material для меди и заменить у предмета один материал на другой.
Вывод: абстрактное именование – скрытый источник проблем реализации проекта.
Логично, что после создания материала, его плотность и название не меняются, для того, чтобы запретить возможность изменения значений полей класса кроме как в конструкторе при создании используется модификатор readonly.
Например:
Java
1
public readonly int MaxPrice;
"
Я не шарю в jav'e и ооп, и честно говоря я не понял, что он имеет в виду в первом случае, но во втором - я так понял нужно после создания объекта класса UniformMaterial каким-то образом запретить изменять материал и плотность. Можно ли это сделать в питоне?
0
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
14.01.2014, 12:08 10
Цитата Сообщение от Zarex Посмотреть сообщение
Логично, что после создания материала, его плотность и название не меняются, для того, чтобы запретить возможность изменения значений полей класса кроме как в конструкторе при создании используется модификатор readonly.
Например:
Java
1
public readonly int MaxPrice;
"
Я не шарю в jav'e и ооп, и честно говоря я не понял, что он имеет в виду в первом случае, но во втором - я так понял нужно после создания объекта класса UniformMaterial каким-то образом запретить изменять материал и плотность. Можно ли это сделать в питоне?
В питоне нет явного указания на тип переменных. Все есть суть объекты, другое дело, что некоторым видам объектов присущи черты обычных типов данных с константным атрибутом неизменяемости по умолчанию напрямую.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> some="some string"
>>> some[1] = '1'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> some[1] = '1'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> scort=('some string')
>>> scort[0][1]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: string index out of range
>>> scort[1]
'o'
>>> scort[2]
'm'
>>> scort[1] = '1'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
к таковым относятся строки, кортежи. В питоне нет специальных атрибутов, которые наделяют объекта статусом readonly, да
это и не нужно по факту. Изменение, к примеру строки происходит просто перезаписью с внесенными изменениями.
Python
1
2
3
4
5
'some string'
>>> some=some[2:]
>>> some
'me string'
>>>
Поэтому использование в атрибутах класса вновь создаваемых объектов типа кортеж и/или строка заранее подразумевает их статус readonly в рамках использования этого экземпляра класса, но с другой стороны никто не мешает его перезаписать, присвоив новое значение.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> class some:
...   def __init__(self, msg, scort):
...     if not isinstance(msg ,str): raise ValueError, 'WRONG param not string'
...     self.string = msg
...     if not isinstance(scort ,tuple): raise ValueError, 'WRONG param not  tuple'
...     self.contr = scort
... 
>>> s=some('sdf',('qwe',))
>>> s.contr
('qwe',)
>>> s.string
'sdf'
>>> s.string="NEW VALUE"
>>> s.string
'NEW VALUE'
>>> s.contr=('NEW CORTEJ',)
>>> s.contr
('NEW CORTEJ',)
>>>
поэтому ответ - нет, в питоне нет гарантированно не изменяемых объектов с течением времени В этом и прелесть.
1
620 / 474 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
14.01.2014, 12:40 11
fanatdebian, можно с мето программирование поиграться....
0
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
15.01.2014, 20:25  [ТС] 12
Wolkodav, пробовал почитать про метапрограммирование на сайте ibm, но понял, что это не для новичков, так что пока отпадает.
А что касается отсутствия readonly, то и фиг с ним.
За помощь всем спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2014, 20:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Алгоритм выполнения данного задания
Какое из приведенных имен удовлетворяет логическому условию ¬ (первая буква гласная -&gt; вторая буква...

Классы, наследование, адекватность задания, java
Всем доброго времени, есть задания которое нужно решить : Разработать программу для формирования...

Нужно понять принцип выполнения задания
Пользователь вводит с клавиатуры объем в байтах. Перевести его в килобайты, мегабайты, гигабайты и...

создать расписание для выполнения задания C#
как реализовать запуск задания/функции по расписанию: еженедельно, ежедневно, ежемесячно, к ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.