Найти - Пользователи
Полная версия: Пайтон не находит атрибут объекта
Начало » Python для новичков » Пайтон не находит атрибут объекта
1
Darudo_SandStorm
Здравствуйте, я новичок в 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 “CUsers/…/класс.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’?
Заранее спасибо
xam1816
[code python]сюда писать код,чтобы отображался с отступами[/code]
Darudo_SandStorm
  
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}")
xam1816
Darudo_SandStorm
почему появляется сообщение об ошибке ‘Commodity’ object has no attribute ‘name’. Ведь объект Commodity имеет атрибут ‘name’?
Заранее спасибо
двойное подчеркивание в начале имени атрибута означает что его не желательно изменять извне,соответственно доступ к нему затруднен. Имена которые могут использоваться извне должны быть без подчерков
Darudo_SandStorm
xam1816
А как же тогда присловутые геттеры и сеттеры?
 def setCom(self, id, productCode, name, wholeasePrice, retailPrice):
		self.__id = id
		self.__productCode = productCode
		self.__name = name
		self.__wholeasePrice = wholeasePrice
		self.__retailPrice = retailPrice
или в этом месте после знака равно нужно писать атрибутыс другими названиями, хотя так я уже пробовал, все равно не находит атрибуты?
скажите, пожалуйста, как обратиться к этим атрибутам?
xam1816
не знаю будет ли вам понятно из такого примера
 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' было добавлено позже
xam1816
вот ваш исправленный код
 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
Darudo_SandStorm
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
Спасибо огромное еще раз
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