Как мне позвонить в родительский класс в подклассе? -- python поле с участием class поле с участием python-3.x поле с участием methods поле с участием subclass пол Связанный проблема

How do I call on a parent class in a subclass?


1
vote

проблема

русский

Мне нужно создать вызов несвязанного метода, чтобы установить имя и листья, и я не знаю, как. Любая помощь ценится.

Мой код:

 <код> class Plant(object):     def __init__(self, name : str, leaves : int):         self.plant_name = name         self.leaves = leaves     def __str__(self):         return "{} {}".format(self.plant_name, self.leaves)     def __eq__(self, plant1):         if self.leaves == plant1.leaves:             return self.leaves     def __It__(self, plant1):         if self.leaves < plant1.leaves:             print ("{} has more leaves than {}".format(plant1.plant_name, self.plant_name))             return self.leaves < plant1.leaves         elif self.leaves > plant1.leaves:             print ("{} has more leaves than {}".format(self.plant_name, plant1.plant_name))             return self.leaves < plant1.leaves  class Flower(Plant):     def __init__(self, color : str, petals : int):         self.color = color         self.petals = petals      def pick_petal(self.petals)         self.petals += 1   

Точная формулировка задания:

Создайте новый класс под названием цветка. Цветок подклассы от класса растений; Помимо имени, и листья, он добавляет 2 новых атрибута; Цвет, лепестки. Цвет - это строка, которая содержит цвет цветка, а лепесток - это int, у которого есть количество лепестков на цветке. Вы должны быть в состоянии создать метод INIT для настройки экземпляра. С помощью init вы должны сделать вызов несвязанным методом для установки имени и листьев. Кроме того, создать метод, называемый rick_petal, который уменьшает количество лепестков на цветке.

Английский оригинал

I need to create an UNBOUND method call to Plant to setup name and leaves and I don't know how. Any help is appreciated.

My code:

class Plant(object):     def __init__(self, name : str, leaves : int):         self.plant_name = name         self.leaves = leaves     def __str__(self):         return "{} {}".format(self.plant_name, self.leaves)     def __eq__(self, plant1):         if self.leaves == plant1.leaves:             return self.leaves     def __It__(self, plant1):         if self.leaves < plant1.leaves:             print ("{} has more leaves than {}".format(plant1.plant_name, self.plant_name))             return self.leaves < plant1.leaves         elif self.leaves > plant1.leaves:             print ("{} has more leaves than {}".format(self.plant_name, plant1.plant_name))             return self.leaves < plant1.leaves  class Flower(Plant):     def __init__(self, color : str, petals : int):         self.color = color         self.petals = petals      def pick_petal(self.petals)         self.petals += 1 

Exact wording of the assignment:

Create a new class called Flower. Flower is subclassed from the Plant class; so besides name, and leaves, it adds 2 new attributes; color, petals. Color is a string that contains the color of the flower, and petal is an int that has the number of petals on the flower. You should be able to create an init method to setup the instance. With the init you should make an UNBOUND method call to plant to setup the name and leaves. In addition, create a method called pick_petal that decrements the number of petals on the flower.

</div
              
         
         

Список ответов

3
 
vote
vote
Лучший ответ
 

«Несвязанный вызов метода» означает, что вы называете методом в классе, а не на экземпляре класса. Это означает что-то вроде <код> Plant.some_method .

единственный вид несвязанный звонок, который имеет смысл в этом контексте, состоит в том, чтобы вызвать <код> __init__ метода базового класса. Это, кажется, выполняет требование «настроить имена и листья», и в прошлом был распространенный способ сделать наследование.

Это выглядит так:

 <код> class Flower(Plant):     def __init__(self, name, leaves, color, petals):         Plant.__init__(self, ...)         ...   

Вам нужно будет пройти в соответствующие аргументы <код> __init__ . Первый - <код> self , остальные определяются <код> Plant.__init__ в базовом классе. Вам также необходимо будет исправить синтаксис для списка аргументов, как «цвет: STR» не является действительным Python.


Примечание. Вообще говоря, лучшее решение состоит в том, чтобы позвонить Super Вместо того, чтобы делать необработанный метод вызова на родительском классе <Код> __init__ . Я не уверен, что вы можете сделать с этим советом, хотя. Может быть, инструктор - это наследование старого пути, прежде чем изучать новый путь?

Для этого назначения вы, вероятно, должны использовать <код> Plant.__init__(...) , поскольку это то, что назначение явно просит вас сделать. Вы можете следить за инструктором, чтобы спросить о class NewController < OldController def new_controller_action # new hotness end end 0 .

 

An "unbound method call" means you're calling a method on the class rather than on an instance of the class. That means something like Plant.some_method.

The only sort of unbound call that makes sense in this context is to call the __init__ method of the base class. That seems to fulfill the requirement to "setup the names and leaves", and in the past was the common way to do inheritance.

It looks like this:

class Flower(Plant):     def __init__(self, name, leaves, color, petals):         Plant.__init__(self, ...)         ... 

You will need to pass in the appropriate arguments to __init__. The first is self, the rest are defined by Plant.__init__ in the base class. You'll also need to fix the syntax for the list of arguments, as `color : str' is not valid python.


Note: generally speaking, a better solution is to call super rather than doing an unbound method call on the parent class __init__. I'm not sure what you can do with that advice, though. Maybe the instructor is having you do inheritance the old way first before learning the new way?

For this assignment you should probably use Plant.__init__(...) since that's what the assignment is explicitly asking you to do. You might follow up with the instructor to ask about super.

</div
 
 
   
   
1
 
vote

Ответ от Bryan идеален. Только ради завершения:

 <код> class NewController < OldController   def new_controller_action     # new hotness   end end 1  

Это «классический», «необетовой» стиль наследования и вышла из моды давно (почти 15 лет по состоянию на 2016 год), потому что он разрывается с несколькими наследованиями. Для справки см. Сообщение « Объединенные типы и классы в Python 2.2 "bdfl. Сначала я подумал, что это может быть очень старым заданием, но я вижу, что назначение использует наследство «нового стиля» (наследство из <код> class NewController < OldController def new_controller_action # new hotness end end 2 была подписью нового стиля в Python 2, потому что по умолчанию Старый стиль в Python 3 есть только новый стиль). Чтобы сделать его работать для многократного наследования, вместо того, чтобы явно вызвать родительский класс (<код> class NewController < OldController def new_controller_action # new hotness end end 3 оператора), мы используем функцию <код> class NewController < OldController def new_controller_action # new hotness end end 4 , как это в Python 2:

.
 <код> class NewController < OldController   def new_controller_action     # new hotness   end end 5  

или только это после Python 3 (после того, как PEP 0367 будет точным):

 <код> class NewController < OldController   def new_controller_action     # new hotness   end end 6  

Даже если в Python 3 Ново-стиль наследования - это значение по умолчанию, вам все еще рекомендуется явно наследовать от <Кода> class NewController < OldController def new_controller_action # new hotness end end 7 .

 

The answer from Bryan is perfect. Just for the sake of completion:

# Looks like the assignment asks for this class Flower(Plant):     def __init__(self, name, leaves, color, petals):         # call __init__ from parent so you don't repeat code already there         Plant.__init__(self, name, leaves)           self.color = color         self.petals = petals 

This is the "classic", "non-cooperative" inheritance style and came out of fashion a long time ago (almost 15 years as of 2016), because it breaks with multiple inheritance. For reference see the post "Unifying types and classes in Python 2.2" by the BDFL. At first I thought it could be a very old assignment, but I see the assignment uses the "new-style" inheritance (inheriting from object was the signature of the new-style in Python 2 because the default is the old-style, in Python 3 there is only the new-style). In order to make it work for multiple inheritance, instead of calling the parent class explicitly (the Plant.__init__ statement), we use the super function like this in Python 2:

        super(Flower, self).__init__(name, leaves) 

Or just this after Python 3 (after PEP 0367 to be precise):

        super().__init__(name, leaves) 

Even if in Python 3 the new-style of inheritance is the default, you are still encouraged to explicitly inherit from object.

</div
 
 
 
 

Связанный проблема

2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально  ( Submodules popen refuses to run a command even though os system works fine ) 
Всякий раз, когда я запускаю этот скрипт: <код> gcalctool0 Я постоянно получаю эту ошибку: <код> gcalctool1 Тем не менее, <код> gcalctool2 определе...

0  Запрос доступа от класса Inherit (View)  ( Access request from inherit class view ) 
Как я могу предъявить запрос на var, если я не реализую методы Get / Post из класса Inherit (View)? <код> class Base(View): def __init__(self): ...

5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты?  ( How can i get mercurial to push commits again ) 
Я не знаю, что я ничего изменил и работаю Ubuntu 10.10. Mercurial работает нормально, а затем внезапно, когда я начал толкать сегодня утром, я начал получать ...

0  Пытаясь создать dataframe из другого dataframe с определенными ограничениями  ( Trying to create a dataframe from another dataframe with certain restrictions ) 
Я пытаюсь написать модель VAR в Python (где не разрешается использовать предварительно сделанные функции, такие как var в Statsmodel). Для этого мне нужна м...

51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала  ( Pythons requests missing dependencies for socks support when using socks5 fro ) 
Я пытаюсь взаимодействовать с API из My Python 2.7 Shell, используя пакет, который опирается на запросы Python. Вещь - это удаленный адрес блокируется моей се...

-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict  ( How to sum values when zipping similar key to build a dict ) 
У меня есть <код> A = [a, b, c, d, a, d, c] и <код> B=[1, 2, 3, 4, 5, 6, 7] Почему <код> dict(zip(A,B)) не возвращается <код> {'a': 6, 'b': 2, 'c': 10, '...

0  Python / django - Начало Apache с mod_wsgi  ( Python django starting apache with mod wsgi ) 
пытается запустить mod_wsgi. Получение опорной ошибки связанной с FMOD. <код> [root@host]# mod_wsgi-express start-server wsgi.py --port=80 > --user www...

0  NameError: Имя «Домашние животные» не определены. Питон  ( Nameerror name pets is not defined python ) 
Это код, который я использую, но каждый раз, когда я пытаюсь запустить его, я получаю эту ошибку в терминале: <код> Traceback (most recent call last): Fil...

0  Как бы я избавился от определенных персонажей, а затем выпустите очищенную струну в Python?  ( How would i get rid of certain characters then output a cleaned up string in pyt ) 
В этом фрассетере кода я пытаюсь получить ссылки на изображения, размещенные в группеЧанчатке определенным пользователем: <код> import groupy from groupy im...

1  Где многопроцессор  ( Where is multiprocessing process ) 
Я портирую рабочее приложение из Python 3.3-34 и столкнулся с странной ситуацией. Класс Multipressing.Process отсутствует в загрузке с Python.org. Вместо этог...

1  Нахождение корней с Scipy.Optimize.root  ( Finding roots with scipy optimize root ) 
Я пытаюсь найти root y функции, называемой f с помощью python. Вот мой код: <код> def f(y): w,p1,p2,p3,p4,p5,p6,p7 = y[:8] t1 = w - 0.500371726*...

0  Объедините несколько столов для ответа JSON в Django Read Framework  ( Combine multiple tables for a json response in django rest framework ) 
Я использую Django Read Framework для моего serializers . Мне нужно создать веб-сервис, который сочетает в себе поля в трех таблицах и дает JSON. У меня ес...

0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV  ( After appending cells find min and max of five different categories in a csv fi ) 
Привет всем У меня есть вопрос. Я просто сейчас изучаю мин и макс. У меня проблемы в нахождении мин и максимум пяти столбцов для каждой категории Вот, что...

3  Использование None As Parameter к аргументу ключевого слова [дубликат]  ( Using none as parameter to keyword argument ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже имеет ответ здесь : ...

0  Jupyter Lab / Ubuntu / «Нет модуля по имени BCLZ»  ( Jupyter lab ubuntu no module named bcolz ) 
Bcolz был успешно установлен и может работать в Python3 (попробовал в терминале). Однако, когда я попробовал это в Jupyter Lab (или ноутбук), приходит ошибка:...

Связанный проблема

2  подмодул .POPEN отказывается запускать команду, хотя OS.System работает нормально 
0  Запрос доступа от класса Inherit (View) 
5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты? 
0  Пытаясь создать dataframe из другого dataframe с определенными ограничениями 
51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала 
-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict 
0  Python / django - Начало Apache с mod_wsgi 
0  NameError: Имя «Домашние животные» не определены. Питон 
0  Как бы я избавился от определенных персонажей, а затем выпустите очищенную струну в Python? 
1  Где многопроцессор 
1  Нахождение корней с Scipy.Optimize.root 
0  Объедините несколько столов для ответа JSON в Django Read Framework 
0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV 
3  Использование None As Parameter к аргументу ключевого слова [дубликат] 
0  Jupyter Lab / Ubuntu / «Нет модуля по имени BCLZ»