Классы python
Начиная с Python 2.2, помимо классических классов существует классы так называемого нового стиля. Классом нового стиля называется класс, у которого базовым классом является встроенный объект (например, list или dict) или объект object. Для классов старого и нового стили отличаются результатом выполнения функции type(), а также вывод атрибутов __class__ и __bases__ для экземпляров классов.
Классы нового стиля
class Class1: # Классический класс
pass
class Class2(object): # Класс нового стиля
pass
class Class3(list): # Класс нового стиля
pass
print type(Class1) # Выведет:
print type(Class2) # Выведет:
print type(Class3) # Выведет:
# __bases__ содержит кортеж с базовыми классами
print Class1.__bases__ # Выведет: ()
print Class2.__bases__ # Выведет: (,)
print Class3.__bases__ # Выведет: (,)
c1, c2, c3 = Class1(), Class2(), Class3()
print c1.__class__ # Выведет: __main__.Class1
print c2.__class__ # Выведет:
print c3.__class__ # Выведет:
print type(c1) # Выведет:
print type(c2) # Выведет:
print type(c3) # Выведет:
Далее...
К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.
class M(object): def __init__(self, data): self.__data = data def data(self): return self.__data init_data = ['php'] m = M(init_data) print m.data() # ['php'] init_data.append('python') # объекты init_data и M.__data ссылаются на один и тот же объект print init_data # ['php', 'python'] print m.data() # ['php', 'python'] data = m.data() print data # ['php', 'python'] data.append('ruby') # теперь уже 3 объекта ссылаются на одну и ту же переменную print data # ['php', 'python', 'ruby'] print init_data # ['php', 'python', 'ruby'] print m.data() # ['php', 'python', 'ruby']
На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.
M = lambda data: data init_data = ['php'] m = M(init_data) m.append('python') print m # ['php', 'python'] print init_data # ['php', 'python'] print m is init_data # True
Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.Далее...