Top Banner
CHARLES UNIVERSITY IN PRAGUE http://d3s.mff.cuni.cz faculty of mathematics and physics NPRG065: Programming in Python Lecture 11 Tomas Bures Petr Hnetynka {bures,hnetynka}@d3s.mff.cuni.cz
10

NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

Jul 08, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

CHARLES UNIVERSITY IN PRAGUE

http://d3s.mff.cuni.cz

faculty of mathematics and physics

NPRG065: Programming in PythonLecture 11

Tomas Bures

Petr Hnetynka{bures,hnetynka}@d3s.mff.cuni.cz

Page 2: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

2

Descriptors

Descriptor ~ an object attribute with the methods

__get__(self, instance, owner)

__set__(self, instance, value)

__delete__(self, instance)

methods called when the attribute is accessed

Compared to __getattr__, etc.

__getattr__, etc. defined on the class with attribute

__get__, etc. defined on the attribute’s class

Seedescriptors.py

Page 3: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

3

Instance attributelookup

Figure from https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/

class Class:...

instance = Class()instance.foobar

Page 4: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

4

__new__(cls[, ...])

the real “constructor” (create the object)__init__ only initializes the object, it does not create it

a class method

creates a new instance of class cls

remaining arguments are those passed to the object constructor expression

if __new__() returns an instance of cls, then the new instance’s __init__() will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__()

allows subclasses of immutable types (like int, str, or tuple) to customize instance creation

Seenew_immutable.py

Page 5: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

5

Metaclasses

Factories for creating classes

“Common” class definition

Procedural definition via metaclass

These two definitions are completely equivalentIn fact, Python transforms the first one into the second one

type is a metaclass

class Spam:

eggs = 'my eggs'

Spam = type('Spam', (object,), dict(eggs='my eggs'))

Seemeta_basic.py

Page 6: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

6

Metaclasses

Even in “common” definition, we can prescribe the metaclass

is equivalent to

We can define own metaclassesas subclasses of type

class Spam:

eggs = 'my eggs'

class Spam(metaclass=type):

eggs = 'my eggs'

Seemeta_basic_own.py

Page 7: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

7

Metaclasses

Seemeta_examples.pyfor more examples

Page 8: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

8

Class attributelookup

Figure from https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/

class Class:...

Class.foobar

Page 9: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

9

Metaclasses

Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8)

ABC class has ABCMeta metaclassthe following definition is equivalent

import abc

class PluginBase(abc.ABC):

@abc.abstractmethod

def process(self, input):

pass

class ToUpperPlugin(PluginBase):

def process(self, input):

return input.upper()

class PluginBase(metaclass=abc.ABCMeta):

...

Seemeta_abc.py

Page 10: NPRG065: Programming in Python - Univerzita Karlova€¦ · 9 Metaclasses Metaclasses are used within the implementation of Abstract Base Classes (see lecture 8) ABC class has ABCMeta

10The slides are licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.