Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для weend
2 / 2 / 3
Регистрация: 21.09.2013
Сообщений: 20

Как сделать суперкласс атрибутом производного класса?

21.09.2013, 14:58. Показов 2681. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня тоже мозг от названия кипит чутка, но как это по другому назвать не знаю. На деле все гораздо проще чем в названии темы. Нужно наследовать суперкласс, да так, что бы обращаться к нему в виде

Python
1
SubClass.SuperClass.super_class_method()
Например, я хочу так:

Python
1
2
3
4
5
6
7
8
9
10
11
class MySuperClass:
 def super_class_func(self,text):
  print("Imma super class func! And i've %s !" % text)
 
class SubClass(MySuperClass):
 def __init__(self):
  pass
 
 
foo = SubClass()
foo.MySuperClass.super_class_func('mega super cool text')
Но это (естественно) вызовет ошибку.

Есть вариант делать вот-так вот
Python
1
2
3
4
5
class SubClass:
 SuperClass = MySuperClass
 
foo = SubClass()
foo.SuperClass.super_class_func(foo,'mega text super cool')
Но приходится в списке аргументов передавать еще и сам объект дочернего класса. Кто-нибудь поможет разобраться? Пилить костыли желания совсем нет

UPD: В методе суперкласса убирать self не вариант.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.09.2013, 14:58
Ответы с готовыми решениями:

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

Как из метода производного класса вызвать поле родительского класса
Добрый день! Помогите пожалуйста вызвать поле базового класса из метода производного класса. Код, составленный мною выводит результат...

11
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
21.09.2013, 16:07
для этого есть super, ну или руками вызывать конструктор родителя в конструкторе (__init__) потомка
0
 Аватар для weend
2 / 2 / 3
Регистрация: 21.09.2013
Сообщений: 20
21.09.2013, 17:12  [ТС]
s0rg, Тут дело то в другом, мне не нужно конструктор вызвать, а нужно использовать методы суперкласса с потомке, но при этом явно указывая этот суперкласс в обращении.

Т.е вместо

Python
1
2
3
class MyClass(MySuperClass): pass
 
MyClass.method_from_superclass(args)
использовать

Python
1
MyClass.MySuperClass.method_from_superclass(args)
Если это можно сделать как-то через super, то буду благодарен за помощь, пока я себе это не представляю.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
21.09.2013, 18:22
А зачем вам такое извращение вообще понадобилось?
Наследование как раз нужно, чтобы унаследовать все методы и атрибуты другого класса.

Не наследуй класс тогда, а просто вызывай MySuperClass из класса MyClass.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.09.2013, 22:29
Цитата Сообщение от s0rg Посмотреть сообщение
конструктор родителя в конструкторе (__init__) потомка
__init__ - это не конструктор
dip3. __init__ объясняет, почему

конструктор - это __new__
python.org. __new__

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> class Sup:
...     def sm(self):
...         return str(self) + ' super method'
... 
>>> class C(Sup):
...     def __init__(self):
...         self.Sup = super()
...     def sm(self):
...         return str(self) + ' pseudo super method'
...     def m(self):
...         return str(self) + ' method'
... 
>>> c = C()
>>> c.Sup.sm()
'<__main__.C object at 0x7f0f0c453ad0> super method'
>>> c.sm()
'<__main__.C object at 0x7f0f0c453ad0> pseudo super method'
>>> c.m()
'<__main__.C object at 0x7f0f0c453ad0> method'
>>>
0
 Аватар для weend
2 / 2 / 3
Регистрация: 21.09.2013
Сообщений: 20
22.09.2013, 02:39  [ТС]
Цитата Сообщение от tsar925 Посмотреть сообщение
А зачем вам такое извращение вообще понадобилось?
Наследование как раз нужно, чтобы унаследовать все методы и атрибуты другого класса.

Не наследуй класс тогда, а просто вызывай MySuperClass из класса MyClass.
В таком случае первым аргументом приходится передавать объект класса, что довольно неудобно. В топике есть пример.

Добавлено через 22 минуты
По поводу зачем - у меня есть класс, который объединяет множество других классов, и появляется довольно много методов которые отвечают за совершенно разные действия. Хотелось бы разграничить всё это для удобства.

accept, Уже чуть-чуть напоминает что я хочу, но область видимости класса все равно засоряется, и как быть с множественным наследованием?

Python
1
2
3
4
5
6
7
8
9
10
11
class FirstSuper:
 def first_super_func(self,text):
  print(text)
 
class SecondSuper:
 def second_super_func(self,*args):
  print(args)
 
class MainClass(FirstSuper, SecondSuper):
 def __init__(self):
  # ?
Я все-же склоняюсь к варианту вызова суперкласса из наследника, но передавать постоянно первым аргументом сам объект неудобно. Придется либо костылить с декоратором, либо отказатся от этой идеи
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.09.2013, 08:29
Цитата Сообщение от weend Посмотреть сообщение
как быть с множественным наследованием?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> class Sup1:
...     def s1m(self):
...         return str(self) + ' super 1 method'
... 
>>> class Sup2:
...     def s2m(self):
...         return str(self) + ' super 2 method'
... 
>>> class C(Sup1, Sup2):
...     def __init__(self):
...         self.Sup1 = super()
...         self.Sup2 = super()
...     def s1m(self):
...         return str(self) + ' pseudo super 1 method'
...     def s2m(self):
...         return str(self) + ' pseudo super 2 method'
...     def m(self):
...         return str(self) + ' method'
... 
>>> c = C()
>>> c.Sup1.s1m()
'<__main__.C object at 0x7f9fbdc37d10> super 1 method'
>>> c.Sup2.s2m()
'<__main__.C object at 0x7f9fbdc37d10> super 2 method'
>>> c.s1m()
'<__main__.C object at 0x7f9fbdc37d10> pseudo super 1 method'
>>> c.s2m()
'<__main__.C object at 0x7f9fbdc37d10> pseudo super 2 method'
>>> c.m()
'<__main__.C object at 0x7f9fbdc37d10> method'
>>>
Цитата Сообщение от weend Посмотреть сообщение
но область видимости класса все равно засоряется
чего ?
0
 Аватар для weend
2 / 2 / 3
Регистрация: 21.09.2013
Сообщений: 20
22.09.2013, 08:55  [ТС]
accept, Спасибо! Работает. Видимо стоит почитать документацию по super(), не правильно понимал как она работает.

чего ?
Возможно не так выразился, имеется ввиду что методы суперклассов все равно наследуются и становятся методами дочернего класса
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>>> class Sup1:
    def func1(self):
        print(' func 1 method ')
 
    
>>> class Sup2:
    def func2(self):
        print(' func 2 method ')
 
        
>>> class Main(Sup1, Sup2):
    def __init__(self):
        self.Sup1 = super()
        self.Sup2 = super()
 
        
>>> qux = Main()
>>> qux.Sup1.func1()
 func 1 method 
>>> qux.func1()
 func 1 method 
>>> 
>>> dir(qux)
['Sup1', 'Sup2', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__',
 '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', 
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', '__weakref__', >'func1', 'func2'<]
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.09.2013, 10:06
Цитата Сообщение от weend Посмотреть сообщение
методы суперклассов все равно наследуются и становятся методами дочернего класса
ну да, в этом и заключается наследование
1
 Аватар для weend
2 / 2 / 3
Регистрация: 21.09.2013
Сообщений: 20
22.09.2013, 13:01  [ТС]
accept, ну ладно, пусть это будет не баг, а фича
Спасибо!
0
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
23.09.2013, 20:54
accept, это все понятно, но как тогда его называть? Инициализатор? ))
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.09.2013, 23:36
Цитата Сообщение от s0rg Посмотреть сообщение
но как тогда его называть? Инициализатор? ))
называй, как хочешь; главное, чтобы не было путаницы
ты называешь что-то - и сразу ясно, что ты имеешь в виду

например, "в конструктор нужно передать это, а в метод инициализации вот это", и ты сразу понял, что сказано; ты не стал угадывать, что имеется в виду

Python
1
2
3
4
5
6
import this
...
Explicit is better than implicit.
...
In the face of ambiguity, refuse the temptation to guess.
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2013, 23:36
Помогаю со студенческими работами здесь

Сделать(разработать) метод-член производного класса определения количества слов в заданном тексте
Разработать иерархию с минимум 2 классами для работы с текстовыми данными (массивом строк) состоящей из: а) базового класса,...

Передача типа производного класса как type parameter в generic методе в методе базового класса
Здравствуйте. Есть классы: абстрактный A и, его производные, B, C и т.д.. В классе A есть метод DoSomething, в ходе выполнения...

Как вызвать метод у производного класса
class Program { static void Main(string args) { MyClass myClass = new MyClass1(1); ...

Как узнать тип производного класса в функции базового
Всем привет! Есть иерархия классов: class1 -&gt; class2-&gt;class3 class2-&gt;class4 class2-&gt;class5 Где...

Как инициализировать элементы данных производного класса через базовый?
есть базовый клас у него есть производный(открытое наследование), как инициализировать элементы-данных производного класа через базовый? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru