Още за типовете и обектите

„ Програмиране с Python“, ФМИ

Стефан Кънев & Николай Бачийски

14.05.2007г.

За какво ще става дума

type

Модулът types

Копиране на обекти

Плитко копиране на произволни обекти

Дълбоко копиране

В картинки (1)

items = [1, 2, 3]
d = dict(items=items)
shallow = copy.copy(d)
deep  = copy.deepcopy(d)


state and references before the items modification

В картинки (2)

items.append(4)


state and references after the items modification

Наследяване на вградени типове

Без наследяване

Старият начин

Преди 2.3 не е било възможно стандартните класове като list, dict, str да се наследяват. Използвали са се няколко стандартни модула, които са предоставяли специални класове, които да бъдат наследявани:

Всички си имат по един атрибут data, в който се пазят реално данните.

Пример: речник с атрибути

class AttrDict(dict):
    def __getattr__(self, attr):
        if attr in self:
            return self[attr]
        else:
            raise AttributeError("exists neither an attribute nor a key called '%s'." % attr)

if __name__ == "__main__":
    d = AttrDict(a = 5, get = 6)
    print d.a
    print d.get
    print d.baba

Частичен пример: низове с case-insensitive сравнения

def lowerFuncs(*names):
    def lowerFunc(clsname, bases, classDict):
        for name in names:
            def comparator(self, other, *args, **kwargs):
                return getattr(str, name)(self._lower, other.lower(), *args, **kwargs)
            classDict[name] = comparator
        return type(clsname, bases, classDict)
    return lowerFunc

class CIStr(str):
    __metaclass__ = lowerFuncs('__eq__', '__le__', '__lt__', '__ge__', '__gt__')

    def __init__(self, *args, **kwargs):
        str.__init__(self, *args, **kwargs)
        # string will never change, so calc once
        self._lower = self.lower()
    def startswith(self, prefix, *args, **kwargs):
        return str.startswith(self.__lower, prefix.lower(), *args, **kwargs)
	def index(sub, *args, **kwargs):
        return str.index(self.__lower, sub.lower(), *args, **kwargs)
	… # и така нататък...

if __name__ == "__main__":
    s = CIStr("Baba")
    print s == "baba"

Списък с

Още въпроси?