type
връща специален обект от тип тип, стойност годна само за директни проверкиdef update(val):
if type(val) == type(0):
_update(val)
else:
raise ValueError("Cannot update non-integer!")
>>> type('baba')
<type 'str'>
>>> type([])
<type 'list'>
>>> type(type('sugrug'))
<type 'type'>
types
type
връща обект, който може да бъде намерен в модула types
from types import *
def update(val):
if type(val) == IntType:
_update(val)
else:
raise ValueError("Cannot update non-integer!")
Type
отзад: DictType
, ListType
, TupleType
, BuiltinFunctionType
и т.н.a = b
не копира стойностите, а насочва a
и b
към един и същи обект!newlist = l[:]
newlist = [x for x in l]
, прави същото като горнияnames = 'a b c'.split()
grades = [1, 2, 3]
both = [names, grades]
shallowCopy = both[:]
names.append('d')
print shallowCopy[0]
copy
import copy
class C:
def __init__(self, l): self.l = l
def __getitem__(self, i): return self.l[i]
items = [1, 2, 3]
c = C(items)
shallow = copy.copy(c)
print c[2], shallow[2]
(3, 3)
items.append(4)
print c[3], shallow[3]
(4, 4)
shallow.l = [42]
print c.l, shallow.l
([1, 2, 3, 4], [42])
import copy
items = [1, 2, 3]
d = dict(items=items)
shallow = copy.copy(d)
deep = copy.deepcopy(d)
items.append(4)
print shallow['items'], deep['items']
items = [1, 2, 3]
d = dict(items=items)
shallow = copy.copy(d)
deep = copy.deepcopy(d)
items.append(4)
list
, огромна част,
от които се припокриват като функционалност с тези от вградените списъци[]
, __getitem__
) и не искаме да си замърсяваме класа с всички методи на list
Преди 2.3 не е било възможно стандартните класове като list
, dict
, str
да се наследяват. Използвали са се
няколко стандартни модула, които са предоставяли специални класове, които да бъдат наследявани:
UserDict.UserDict
— речник, който не поддържа итерация (за съвместимост със стари версии)UserDict.IterableUserDict
— речник, който си поддържа и итерацияUserDict.DictMixin
— добавя стандартните методи на класове, които вече поддържат стандартния интерфейс:
__getitem__()
, __setitem__()
, __delitem__()
, keys()
.UserList.UserList
UserString.UserString
UserString.MutableString
— малко по-различен низ, може да бъде променян в движениеВсички си имат по един атрибут 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
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"