Meta classes - real example

Ethan Furman ethan at stoneleaf.us
Mon Oct 17 17:23:29 EDT 2016


On 10/17/2016 09:23 AM, Mr. Wrobel wrote:
> W dniu 17.10.2016 o 18:16, Chris Angelico pisze:
>> On Tue, Oct 18, 2016 at 3:03 AM, Mr. Wrobel wrote:

>>> I am looking for an example of metaclass usage. Especially I am interestet
>>> in manipulating instance variables, for example:
>>>
>>> My class:
>>> class MrMeta(type):
>>>         pass
>>>
>>> class Mr(object):
>>>         __metaclass__ = MrMeta
>>>
>>>         def __init__(self):
>>>                 self.imvariable = 'Zmienna self'
>>>
>>>         def aome method(self):
>>>                 print 'I am in instance'
>>>
>>> So in general, I would like to create a mechanism, that is changing value
>>> for self.imvariable to capital letters and this should be included in my
>>> metaclass called MrMeta(type).
>>>
>>> Can you guide me please?
>>
>> Are you sure you can't just use a descriptor, such as @property?
>>
>> class Mr(object):
>>     @property
>>     def imvariable(self):
>>         return self._imvariable
>>     @imvariable.setter
>>     def imvariable(self, value):
>>         self._imvariable = str(value).upper()
>
> I am sure that I can do that with setter/getter, but I want to be closer to black magic, that is why I wanted to inlcude Metaclasses.
>
> I know how to acomplish that for class variables, but don;t have any idea how to instance.

Metaclasses work on the class level, not the instance level.  The only* influnce a metaclass is going to have on instances is changes it makes while it's creating the class.

For example, MrMeta could set descriptors in Mr when it is creating the Mr class; it could even put it's own __init__ in the class; but to affect things like instance variables that are added in methods -- well, it is possible, but it is *a lot* of work.

--
~Ethan~

* Okay, somebody prove me wrong!  :)



More information about the Python-list mailing list