type
parameters parameter, in which there are non-classes . However, it is not stipulated anywhere that you will include a class definition.bases
will be filtered out (which can be further used at your discretion). I think an example will explain everything, copy & run :Copy Source | Copy HTML
- # coding: utf-8
- class Metaclass (type):
- '' ' <br/> Metaclass prints all objects from which the class <br/> inherits and which are not classes. <br/> '' '
- def __new__ (cls, name, bases, dict):
- import inspect
- new_bases = []
- for base in bases:
- # filter classes
- # the rest just print
- if inspect .isclass (base):
- new_bases.append (base)
- else :
- print base
- return type . __new__ (cls, name, tuple (new_bases), dict)
- class Print (object):
- __metaclass__ = Metaclass
- class String ( Print , 'Programming' , 'is' , 'all' , 'about' , 'architecture.' , '' ):
- pass
- class Numbers ( Print , 0 , 1 , 2. 718 , 3. 1459 , '' ):
- pass
- class More ( Print , None, True, 'or' , False, [ 'to be' , 'or' , 'not to be' ], '' ):
- pass
- the_end = 'The end.'
- class End ( Print , the_end):
- pass
Copy Source | Copy HTML
- # Python 3+
- def metaclass (name, bases, dict, private = True):
- print ( 'Private:' , private)
- return type (name, bases, dict)
- class MyClass (object, metaclass = metaclass , private = False):
- pass
Copy Source | Copy HTML
- #coding: utf-8
- class EmptyGlass : pass
- class FullGlass : pass
- class GlassMetaclass (type):
- '' ' <br/> GlassMetaclass creates either the EmptyGlass class or FullGlass, <br/> depending on whether True or False is specified in the <br/> class definition . <br/> '' '
- empty_glass = EmptyGlass
- full_glass = FullGlass
- def __new__ (cls, name, bases, dict):
- if bases [- 1 ] is True: # is True, because we need exactly the True object
- # full glass
- bases = [cls.full_glass] + list (bases [: - 1 ])
- elif bases [- 1 ] is False:
- # empty
- bases = [cls.empty_glass] + list (bases [: - 1 ])
- return super ( GlassMetaclass , cls). __new__ (cls, name, tuple (bases), dict)
- class Glass (object):
- __metaclass__ = GlassMetaclass
- if __name__ == '__main__' :
- class MyGlass ( Glass , True): pass # full glass
- class YourGlass ( Glass , False): pass # empty glass
- print issubclass ( MyGlass , FullGlass ) # True
- print issubclass ( YourGlass , EmptyGlass ) # True
Copy Source | Copy HTML
- class Music (MyRe):
- pattern = '/ music'
- class Artist (MyRe):
- pattern = '/ artist / \ d +'
- class Song (MyRe):
- pattern = '/ song / \ d +'
- class Album (MyRe):
- pattern = '/ album / \ d +'
Copy Source | Copy HTML
- class Music (MyRe, '/ music' ):
- class Artist (MyRe, '/ artist / \ d +' ): pass
- class Song (MyRe, '/ song / \ d +' ): pass
- class Album (MyRe, '/ album / \ d +' ): pass
Source: https://habr.com/ru/post/78924/
All Articles