Snippets about method.

method 101

Instancemethods take self argument, classmethods take cls argument, staticmethods take no magic argument(not very useful).

class FancyDict(dict):
    def fromkeys(cls, keys, value=None):
        data = [(key, value) for key in keys]
        return cls(data)
>>> FancyDict(key1='value1', key2='value2', key3='value3')
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}
>>> FancyDict.fromkeys(['key1', 'key2'], 'value')
{'key2': 'value', 'key1': 'value'}

We are gonna talk a little more about classes, __slots__, you can use it to omit dict of python instances and reduce memory use in the end:

class Tiny(object):
    __slots__ = ['value']
    def __init__(self, value):
        self.value = value
t = Tiny(1)
>>> t.value
>>> t.value2 = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Tiny' object has no attribute 'value2'

Then talk a little about __new__, this is the actual constructor method of one instance, and it is one static method:

class WrappingInt(int):
    __slots__ = []
    def __new__(cls, value):
        value = value % 255
        self = int.__new__(cls, value)
        return self

wrapping_int = WrappingInt(256)
>>> wrapping_int