1

Тема: додавання з усіх створенних об'єктів класу value до parent

class Basket(object):
    def __init__(self, liter, kg, meter):
        self.liter = liter
        self.kg = kg
        self.meter = meter
        self.basket_plus = []

    def capacity(self, value):
        if self.liter + self.kg + self.liter > value:
            print('{} basket is empty'.format(value))
        else:
            self.basket_plus.append(value)
            print('basket', self.basket_plus)
        all_basket = self.basket_plus
        print('\nall basket', all_basket)

class Package(Basket):
   
    def __init__(self, kg, meter):
        self.kg = kg
        self.meter = meter
        self.package_plus = []
       
    def capacity(self, value):
        if self.kg + self.meter == value:
            print('{}, {} you\'re finished'.format(self.kg, self.meter))
        self.package_plus.append(value)
        print('package',self.package_plus)
        all_package = self.package_plus
        print('\nall package', all_package)

def some_class(obj):
       obj.capacity(3)
       obj.capacity(24)

def main():
   
    b = Basket(20, 18, 5)
    b1 = Basket(10, 50, 12)
    b.capacity(150)
    b1.capacity(130)
    p = Package(100, 100)
    p.capacity(200)
    some_class(Basket(1,1,1))
    some_class(Package(12, 12))
   


if __name__ == '__main__':
    main()

Питань не багато але вони є:
1. При створенні об'єкта класу Корзина нема додовання до self.basket_plus(list) видає кожну окремо.
2. Не второпаю, як із класу Package добавити value до self.basket_plus(list), адже child бере все від parent в кожному є своя логіка та об'єм, але ж через some_class(obj) йде додовання до package_plus and basket_plus що ще треба додати до коду щоб воно працювало. Хочаб де про це можно прочитати.
3. Усі value з інших класів та функцій потрібно зібрати в  self.basket_plus(list)

2 Востаннє редагувалося koala (21.11.2019 08:17:14)

Re: додавання з усіх створенних об'єктів класу value до parent

Я не зовсім зрозумів, що вам треба. Припускаю, що потрібна змінна класу, але ж ви пишете self, а self - то якраз екземпляр. Можете навести приклад, що ваша програма виводить, а що має виводити?
Що ж до створення змінних в класі, то вони створюються в __init__, тобто треба викликати Basket.__init__ з  Package.__init__. Правильний спосіб це зробити - такий:

class Package(Basket):
    super(Package, self).__init__(None, kg, meter) #не знаю, що має бути в liter, поставив None

В принципі, можна також написати Basket.__init__(self, None, kg, meter), але це створить проблеми при зміні структури успадкування.

Подякували: prolk30551

3

Re: додавання з усіх створенних об'єктів класу value до parent

koala написав:

Я не зовсім зрозумів, що вам треба. Припускаю, що потрібна змінна класу, але ж ви пишете self, а self - то якраз екземпляр. Можете навести приклад, що ваша програма виводить, а що має виводити?
Що ж до створення змінних в класі, то вони створюються в __init__, тобто треба викликати Basket.__init__ з  Package.__init__. Правильний спосіб це зробити - такий:

class Package(Basket):
    super(Package, self).__init__(None, kg, meter) #не знаю, що має бути в liter, поставив None

В принципі, можна також написати Basket.__init__(self, None, kg, meter), але це створить проблеми при зміні структури успадкування.

до super я ще не дійшов, бо тільки розпочав вивчати цю мову, може якийсь  місяц.
task:
1. створити клас Корзина та емкість в неї.
2. створити клас Пакет теж з емкістью.
3. сворити любий клас щоб його можливо було добавити до Корзини та Пакету
це все я начебто створив, 3-ій пункт я виришив зробити через функцію, та в неї передавати вже об'єкт.
Тут все добре виводить self.basket_plus[2, 34] , та self.package_plus[13,  34] це приклад.
та коли я створюю нові об'єкти в package, basket то виводить наприклад basket[100] так само с package, окремо, потрібно щоб
змінні value додавались та зберігались в self.basket_plus, та self.package_plus.
я пробував через for , але результат теж самий

4

Re: додавання з усіх створенних об'єктів класу value до parent

koala написав:

Я не зовсім зрозумів, що вам треба. Припускаю, що потрібна змінна класу, але ж ви пишете self, а self - то якраз екземпляр. Можете навести приклад, що ваша програма виводить, а що має виводити?
Що ж до створення змінних в класі, то вони створюються в __init__, тобто треба викликати Basket.__init__ з  Package.__init__. Правильний спосіб це зробити - такий:

class Package(Basket):
    super(Package, self).__init__(None, kg, meter) #не знаю, що має бути в liter, поставив None

В принципі, можна також написати Basket.__init__(self, None, kg, meter), але це створить проблеми при зміні структури успадкування.

basket [150]
basket [130]
100, 100 you're finished
package [200]
basket [3]
basket [3, 24]
package [3]
12, 12 you're finished
package [3, 24])

1 та 2 линия не виводить їх разом basket[150, 130] а окремо.  6-та та остання з цим впоролась

5 Востаннє редагувалося koala (21.11.2019 12:18:02)

Re: додавання з усіх створенних об'єктів класу value до parent

Вам треба чітко розуміти, що є чим. До речі, правильні назви тут дуже сильно допоможуть - capacity означає "місткість", а назви методів бажано робити дієсловами, скажімо insert, put, add. Цей метод же має додавати елемент до кошика, правильно?
Почнімо з коду в main:

    b = Basket(20, 18, 5) #створили кошик b
    b1 = Basket(10, 50, 12) #створили інший кошик b1
    b.capacity(150) #поклали до b число 150
    b1.capacity(130) #поклали до b1 число 130
    p = Package(100, 100) #створили пакет p
    p.capacity(200) #поклали до p число 200
    some_class(Basket(1,1,1)) #створили кошик і передали його до функції some_class
    some_class(Package(12, 12)) #створили пакет і передали його до функції some_class 

Це все не викликає питань? У кошику b є число 150, у кошику b1 - число 130, у неназваному кошику, переданому в some_class - 3 і 24, які і виводяться в 6-му рядку.

Тепер - трохи про те, що у вас, схоже, викликає проблеми.
Коли ви проголошуєте клас, ви створюєте об'єкт класу, що зберігає те, що ви в ньому проголосили, тут - по два методи:
Basket.__init__
Basket.capacity
Package.__init__
Package.capacity
І тут - УВАГА - ви застосовуєте скорочену форму виклику:

b.capacity(150) #те саме, що
Basket.capacity(b, 150)

Параметр self - це не якась магія (крім хіба що випадку з __init__), а просто перший параметр методу, що записується перед крапкою. Можете самі переконатися:

>>> "a b".split()
['a', 'b']
>>> str.split("a b") 
['a', 'b']
>>> type("a b").split("a b") #і навіть так
['a', 'b']

Я підозрюю (хоча з умови це ніяк не випливає), що ви намагалися створити спільне сховище для всіх кошиків; очевидно, що воно не може бути в self, бо self - це просто параметр. Таке сховище слід чіпляти до класу:

class Basket:
    basket_plus = []
    ...
        Basket.basket_plus.append(...) #Basket.basket_plus - змінна класу, а не об'єкту
Подякували: leofun01, prolk3055, ping3

6

Re: додавання з усіх створенних об'єктів класу value до parent

Дякую за роз'яснення. Змінну до класу я додавав, але для мене було не зрозуміло як її достати, бо якщо вона об'явлена в класі, то методи її не бачать. Тепер я знаю, зараз спробую переписати код.

Подякували: ping1

7

Re: додавання з усіх створенних об'єктів класу value до parent

class Basket(object):
    basket_plus = []
    def __init__(self, value):
        self.value = value
        
    def count(self):
        result = self.value*5+10
        Basket.basket_plus.append(result)
        return result

class Package(Basket):
    def __init__(self, value, number = 1):
        super(Package, self).__init__(value)
        self.number = number 

    def count(self):
        prev = super().count()
        result = prev * 5 + self.number
        Basket.basket_plus.append(result)
        
def some_function(obj):
    obj.count()
def main():
   basket = Basket(5)
   basket.count()
   basket1 = Basket(7)
   basket1.count()
   package = Package(8, 22)
   package.count()
   some_function(Package(55))
   print(Basket.basket_plus)
    
if __name__ == '__main__':
    main()                

чуть скоротив код, бо там не зрозуміло було що до чого
Також дякую за SUPER. Ще потрибно розібратися з наслідуванням.

8

Re: додавання з усіх створенних об'єктів класу value до parent

#простий приклад реалізації класу "Кошик"
class Basket(list):
    def __init__(self, maxw, maxi):
        self.__MaxWeight = maxw
        self.__MaxItems  = maxi

    def append(self, obj):
        """Додає щось у кошик. Є перевірка на вмісткість.
           Перевірка на максимальну вагу не додана, але
           може бути реалізована аналогічно перевірці на
           вмісткість"""
        if len(self) < self.__MaxItems:
            super().append(obj)
b = Basket(3,5)

b.append(2)
b.append(3)
b.append(6)
b.append(5)
b.append(4)
b.append(1) # не буде додано у кошик

print(b)
Подякували: prolk30551

9

Re: додавання з усіх створенних об'єктів класу value до parent

ur_naz написав:
#простий приклад реалізації класу "Кошик"
class Basket(list):
    def __init__(self, maxw, maxi):
        self.__MaxWeight = maxw
        self.__MaxItems  = maxi

    def append(self, obj):
        """Додає щось у кошик. Є перевірка на вмісткість.
           Перевірка на максимальну вагу не додана, але
           може бути реалізована аналогічно перевірці на
           вмісткість"""
        if len(self) < self.__MaxItems:
            super().append(obj)
b = Basket(3,5)

b.append(2)
b.append(3)
b.append(6)
b.append(5)
b.append(4)
b.append(1) # не буде додано у кошик

print(b)

class Basket(list):
    def __init__(self, maxv, maxi):
        self.__MaxWeight = maxv
        self.__MaxItems = maxi

    def append(self, weight, obj):
        if len(self) < self.__MaxItems  and weight <=self.__MaxWeight :
            super().append(obj)


b = Basket(230, 5)

b.append(111,2)
b.append(223,54)
b.append(300,5)
b.append(233,8)
b.append(220,9)
print(b)

Дякую, перевірка на вагу... Якось так

10

Re: додавання з усіх створенних об'єктів класу value до parent

ні, не так, треба скласти вагу і порівняти с максимальною

class Basket(list):
    def __init__(self, maxw, maxi):
        self.__MaxWeight = maxw
        self.__MaxItems  = maxi

    def append(self, obj):
        """Додає щось у кошик. Обмеження кількості і ваги
           задані в __MaxItems і __MaxWeight відповідно"""
        if len(self) < self.__MaxItems and sum(self)+obj <=  self.__MaxWeight:
            super().append(obj)
            
b = Basket(10,5)

b.append(1)
b.append(3)
b.append(7) # не буде додано у кошик
b.append(2)
b.append(1)
b.append(2)
b.append(1) # не буде додано у кошик

print(b)
Подякували: prolk30551

11

Re: додавання з усіх створенних об'єктів класу value до parent

Тільки враховуйте, що, успадковуючись від стандартного (чи будь-якого іншого) класу, ви тягнете всі методи. У вашому кошику точно має бути можливість робити слайси та сортувати елементи за допомогою довільної функції-ключа?

Подякували: prolk30551

12

Re: додавання з усіх створенних об'єктів класу value до parent

тут інша проблема, треба перевантажити усі методи яки можуть призвести до помилки, наприклад insert...

Подякували: prolk30551

13

Re: додавання з усіх створенних об'єктів класу value до parent

koala написав:

Тільки враховуйте, що, успадковуючись від стандартного (чи будь-якого іншого) класу, ви тягнете всі методи. У вашому кошику точно має бути можливість робити слайси та сортувати елементи за допомогою довільної функції-ключа?

Що до довільної функції-ключа, де про це можливо прочитати.
Магічні методи с цим якось пов'язані?
Дякую!!!

14

Re: додавання з усіх створенних об'єктів класу value до parent

Ні. Другий (перший після self) параметр.

Подякували: prolk30551