Запутанная композиция объекта python код - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я нахожусь на онлайн-курсе sh по python и обнаружил сбивающий с толку код.

Как показано ниже, это код, который предназначен для определения количества рубашек поло из хлопка.

 class Clothing:
   stock={ 'name': [],'material' :[], 'amount':[]}
   def __init__(self,name):
     material = ""
     self.name = name
   def add_item(self, name, material, amount):
     Clothing.stock['name'].append(self.name)
     Clothing.stock['material'].append(self.material)
     Clothing.stock['amount'].append(amount)
   def Stock_by_Material(self, material):
     count=0
     n=0
     for item in Clothing.stock['material']:
       if item == material:
         count += Clothing.stock['amount'][n]
         n+=1
     return count

 class shirt(Clothing):
   material="Cotton"
 class pants(Clothing):
   material="Cotton"

 polo = shirt("Polo")
 sweatpants = pants("Sweatpants")
 polo.add_item(polo.name, polo.material, 4)
 sweatpants.add_item(sweatpants.name, sweatpants.material, 6)
 current_stock = polo.Stock_by_Material("Cotton")
 print(current_stock)

очевидно, что количество рубашек поло из хлопка равно 4, но все же код дает 10, сумму количества хлопковых рубашек поло и спортивных штанов, в качестве ответа (который на самом деле считается правильным).

Мой вопрос: не должен ли метод polo.Stock_by_Material только повторять элементы в словаре в экземпляре «поло» вместо «поло» и «спортивные штаны»? Я имею в виду, что «поло» и «спортивные штаны» даже не относятся к одному и тому же классу, так почему же метод polo.Stock_by_Material будет подсчитывать количество обоих классов?

Пожалуйста, простите меня, если я сделал здесь несколько глупых ошибок. У меня всего 1 неделя в python без опыта программирования. Большое спасибо!

Ответы [ 4 ]

1 голос
/ 18 июня 2020

Вы агрегируете по материалу (Хлопок). Для класса рубашки и спортивных штанов атрибут материала установлен как Хлопок. Следовательно, есть 10 элементов из хлопка, которые вы показываете в конце.

Если вы хотите агрегировать по элементам, вы можете сделать, как показано ниже.

class Clothing:
   stock={ 'name': [],'material' :[], 'amount':[]}
   def __init__(self,name):
     material = ""
     self.name = name
   def add_item(self, name, material, amount):
     Clothing.stock['name'].append(self.name)
     Clothing.stock['material'].append(self.material)
     Clothing.stock['amount'].append(amount)
   def Stock_by_Material(self, material):
     count=0
     n=0
     for item in Clothing.stock['material']:
       if item == material:
         count += Clothing.stock['amount'][n]
         n+=1
     return count
   def Stock_by_item(self, name):
     count=0
     n=0
     for rec in Clothing.stock['name']:
       if rec == name:
         count += Clothing.stock['amount'][n]
         n+=1
     return count

class shirt(Clothing):
   material="Cotton"

class pants(Clothing):
   material="Cotton"

polo = shirt("Polo")
other_polo_shirts = shirt("Polo")

sweatpants = pants("Sweatpants")
polo.add_item(polo.name, polo.material, 4)
other_polo_shirts.add_item(other_polo_shirts.name, other_polo_shirts.material, 16)

sweatpants.add_item(sweatpants.name, sweatpants.material, 6)
current_stock = polo.Stock_by_item("Polo")
print(current_stock)
0 голосов
/ 18 июня 2020

Саги прав. Функция Stock_by_Material должна также проверить 'name', чтобы убедиться, что это 'Polo', только затем добавив его в счетчик. Вы ничего не упускаете, создатели курса только что допустили ошибку.

0 голосов
/ 18 июня 2020

Как упоминает @Sagi, он возвращает весь хлопок, поскольку stock разделяется между объектами Cloathing и его подклассами. Однако ваше замешательство разумно, поскольку этот код нарушает принцип единой ответственности, акции не должны быть частью класса Clothing.

0 голосов
/ 18 июня 2020

Если я правильно понял ваш вопрос,

stock - это переменная static для класса Clothing. любые дочерние классы этого класса будут использовать эту переменную.

Следовательно, и поло, и спортивные штаны используют один и тот же словарь.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...