Форум сайта python.su
0
Здравствуйте, я новичок в Python и пытаюсь разобраться с классами. у меня есть код:
class Commodity():
def __init__(self, id, productCode, name, wholeasePrice, retailPrice):
self.__id = id
self.__productCode = productCode
self.__name = name
self.__wholeasePrice = wholeasePrice
self.__retailPrice = retailPrice
def setCom(self, id, productCode, name, wholeasePrice, retailPrice):
self.__id = id
self.__productCode = productCode
self.__name = name
self.__wholeasePrice = wholeasePrice
self.__retailPrice = retailPrice
def getCom(self):
return self.__id,
self.__productCode,
self.__name,
self.__wholeasePrice,
self.__retailPrice
def description(self):
print(f“{self.name} блаблабла”)
nCom=Commodity(1, 111, ‘cookie’, 300, 400)
print(nCom.getCom())
nCom.setCom(2, 222, ‘cookie’, 333, 444)
print(nCom.getCom())
print(f“наименование нового товара: {nCom.name}.”)
print(f“код нового товара: {nCom.productCode}.”)
print(f“id товара: {nCom.id}”)
print(f“оптовая цена: {nCom.wholeasePrice}”)
print(f“розничная цена: {nCom.retailPrice}”)
программа выполненея в Geany выдает ошибку как на первой картинке, программа выполненная в PyCharm вроде выводит правильный результат, но сообщение об ошибке присутствует все равно:
Traceback (most recent call last):
File “C
Users/…/класс.py”, line 27, in <module>
(1, 111, ‘cookie’, 300, 400)
(2, 222, ‘cookie’, 333, 444)
print(f“наименование нового товара: {nCom.name}.”)
AttributeError: ‘Commodity’ object has no attribute ‘name’
почему появляется сообщение об ошибке ‘Commodity’ object has no attribute ‘name’. Ведь объект Commodity имеет атрибут ‘name’?
Заранее спасибо
Прикреплённый файлы:
Geany.PNG (11,9 KБ)
Офлайн
124
[code python]сюда писать код,чтобы отображался с отступами[/code]
Офлайн
0
class Commodity(): def __init__(self, id, productCode, name, wholeasePrice, retailPrice): self.__id = id self.__productCode = productCode self.__name = name self.__wholeasePrice = wholeasePrice self.__retailPrice = retailPrice def setCom(self, id, productCode, name, wholeasePrice, retailPrice): self.__id = id self.__productCode = productCode self.__name = name self.__wholeasePrice = wholeasePrice self.__retailPrice = retailPrice def getCom(self): return self.__id, self.__productCode, self.__name, self.__wholeasePrice, self.__retailPrice def description(self): print(f"{self.name} блаблабла") nCom=Commodity(1, 111, 'cookie', 300, 400) print(nCom.getCom()) nCom.setCom(2, 222, 'cookie', 333, 444) print(nCom.getCom()) print(f"наименование нового товара: {nCom.name}.") print(f"код нового товара: {nCom.productCode}.") print(f"id товара: {nCom.id}") print(f"оптовая цена: {nCom.wholeasePrice}") print(f"розничная цена: {nCom.retailPrice}")
Офлайн
124
Darudo_SandStormдвойное подчеркивание в начале имени атрибута означает что его не желательно изменять извне,соответственно доступ к нему затруднен. Имена которые могут использоваться извне должны быть без подчерков
почему появляется сообщение об ошибке ‘Commodity’ object has no attribute ‘name’. Ведь объект Commodity имеет атрибут ‘name’?
Заранее спасибо
Офлайн
0
xam1816А как же тогда присловутые геттеры и сеттеры?
def setCom(self, id, productCode, name, wholeasePrice, retailPrice): self.__id = id self.__productCode = productCode self.__name = name self.__wholeasePrice = wholeasePrice self.__retailPrice = retailPrice
Офлайн
124
не знаю будет ли вам понятно из такого примера
class A: # есть класс A def __init__(self): self.__name = 'объект_а' # доступ к атрубуту не желателен извне # но мне нужно как-то его получить,для этого я делаю функцию get_name() def get_name(self): return self.__name # и как-то менять этот атрибут def set_name(self, new_name): self.__name = new_name a = A() print(a.get_name()) # вот так я его могу получить # print(a.__name) # a так не могу : AttributeError: 'A' object has no attribute '__name'. a.__name = 'qweqweqwewe' # определяю атрибут с таким же именем print(a.__name) # и даже видно что изменилось >>> qweqweqwewe print(a.get_name()) # но функция отвечающая за получение атрибута все равно вернет свое имя >>> объект_а a.set_name('новое_имя_А') # спомощью назанченой функции меняю print(a.get_name()) # >>> новое_имя_А print(a.__dict__) # здесь видно что имя атрибута изначально было на самом деле "_A__name" , а '__name' было добавлено позже
Офлайн
124
вот ваш исправленный код
class Commodity(): def __init__(self, id, productCode, name, wholeasePrice, retailPrice): self.__id = id self.__productCode = productCode self.__name = name self.__wholeasePrice = wholeasePrice self.__retailPrice = retailPrice def setCom(self, id, productCode, name, wholeasePrice, retailPrice): self.__id = id self.__productCode = productCode self.__name = name self.__wholeasePrice = wholeasePrice self.__retailPrice = retailPrice def getCom(self): return self.__id,self.__productCode,self.__name,self.__wholeasePrice,self.__retailPrice def description(self): print(f"{self.__name} блаблабла") nCom = Commodity(1, 111, 'cookie', 300, 400) print(nCom.getCom()) nCom.setCom(2, 222, 'cookie', 333, 444) print(nCom.getCom()) nCom.description()
(1, 111, 'cookie', 300, 400)
(2, 222, 'cookie', 333, 444)
cookie блаблабла
Process finished with exit code 0
Офлайн
0
xam1816Обалдеть)) спасибо большое. Ошибка была и в синтаксисе геттера выходит, надо было их через запятую перечислять в одну строчку
вот ваш исправленный код
def setCom(self, new_id, new_productCode, new_name, new_wholeasePrice, new_retailPrice): self.__id = new_id self.__productCode = new_productCode self.__name = new_name self.__wholeasePrice = new_wholeasePrice self.__retailPrice = new_retailPrice
Офлайн