Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Як динамічно зібрати клас з функцій?

with 6 comments

Це може дозволити повторне використання коду ще краще за звичайне OOP з наслідуванням.

Що найважливіше знати про Python? Те що код в блоці class – це такий самий код як і в модулі, просто виконується в просторі імен модуля. І функції там звичайнісінькі.

А щоб перенести something з простору імен класу в простір імен модуля, досить написати в класі просто something = something. Ось так:

def say(self, what):
    print self.name, 'says', what

class Human(object):
    def __init__(self, name):
        self.name = name
    print __init__ # <function __init__ at 0x7fdc3ba25758>
    say = say # here we move say into class namespace
    print say # <function say at 0x7fdc3bb1e1b8>

me = Human('Bunyk')
print me.say # <bound method Human.say of <__main__.Human object at 0x7fdc3ba2a310>>
me.say('hello') # Bunyk says hello

Ще ми бачимо що метод стає прив’язаним до об’єкта, власне коли цей об’єкт створюється класом. А в класі це не метод, це просто функція собі.

Правда я подумав що вираз something = something може спантеличити математиків і вони надовго задумаються над його значенням, і написав міксін, бо паттерни всі знають і люблять. 🙂

Advertisements

Written by bunyk

Лютий 14, 2014 at 16:46

Оприлюднено в Кодерство, Конспекти

Tagged with

Відповідей: 6

Subscribe to comments with RSS.

  1. що таке міксин і як їх використовувати?

    danbst

    Лютий 17, 2014 at 19:34

    • Міксін – це клас від якого наслідуються і який додає нової функціональності, але не є головним предком (не перебуває у відношенні is-a).

      Наприклад є автомобіль Honda Civic Hybrid. Це клас автомобілів що наслідується від Honda Civic (батьківського класу), і міксіна що містить електродвигун та метод рекуперації. Маючи множинне наслідування можна взяти будь-який клас автомобіля, додати цей міксін і отримати новий гібридний клас.

      bunyk

      Лютий 18, 2014 at 08:42

      • тобто в рантаймі ми не можемо скастити об’єкт до типу міксина? Та й взагалі, не знаємо які міксини було використано для створення класу?

        danbst

        Лютий 18, 2014 at 09:39

        • Чому не знаємо, знаємо:

          >>> class A(AttributeError, KeyError):
          ...     ''' just example '''
          ... 
          >>> A.__bases__
          (<type 'exceptions.AttributeError'>, <type 'exceptions.KeyError'>)
          

          А що таке скастити?

          bunyk

          Лютий 18, 2014 at 10:32

          • to cast, вважати його об’єктом того класу.

            dmytrish

            Лютий 25, 2014 at 17:58

          • А, ну якщо скастити це “вважати об’єктом класу”, то Python сам вважає об’єкти об’єктами класу міксіна:

            >>> class A(AttributeError, KeyError):
            ...     ''' example again'''
            ... 
            >>> a = A()
            >>> isinstance(a, KeyError)
            True
            

            bunyk

            Лютий 26, 2014 at 00:33


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: