2

Change the representation of the Python object

 2 years ago
source link: https://www.codesd.com/item/change-the-representation-of-the-python-object.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Change the representation of the Python object

advertisements

In Python, data types (like int, float) both represent a value, but also have some built-in attributes/functions/etc:

In [1]: a = 1.2

In [2]: a
Out[2]: 1.2

In [3]: a.is_integer()
Out[3]: False

Is it possible to reproduce this behavior within Python, e.g. define a class:

class Scalar:
    def __init__(self, value)
        self.value = value

    # other code ....

s = Scalar(1.2)

where I could have s return 1.2 (instead of typing s.value), and do things like a = s -> a = 1.2? The closest I can get to this behavior is adding something like:

def __getitem__(self, key=None):
    return self.value

and using a = s[()], but that doesn't look very good.


where I could have s return 1.2 (instead of typing s.value)

In the console? Then implement the __repr__ method.

a = s -> a = 1.2

To avoid having to use a = s.value, you can implement __call__ and call the object:

>>> class Scalar:
...     def __init__(self, value):
...         self.value = value
...     def __repr__(self):
...         return str(self.value)
...     def __call__(self):
...         return self.value
...
>>> s = Scalar(1.2)
>>> s
1.2
>>> a = s()
>>> a
1.2

Check the documentation about the data model on emulating numeric types.

For example:

class Scalar:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return str(self.value)
    def __call__(self):
        return self.value
    def __add__(self, other):
        return Scalar(self.value + other.value)
    def __lt__(self, other):
        return self.value < other.value
    def ___le__(self, other):
        return self.value <= other.value
    def __eq__(self, other):
        return self.value == other.value
    def __ne__(self, other):
        return self.value != other.value
    def __gt__(self, other):
        return self.value > other.value
    def __ge__(self, other):
        return self.value >= other.value

Can be used like this:

>>> s1 = Scalar(1.2)
>>> s2 = Scalar(2.1)
>>> s1 + s2
3.3
>>> s1 < s2
True
>>> s1 > s2
False
>>> s1 != s2
True
>>> s1 <= s2
True
>>> s1 >= s2
False

There are also the __int__ and __float__ magic methods, which you can implement and use like this (this is more semantically correct):

>>> a = int(s)
>>> a = float(s)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK