Как получилось, что я решил изучать ООП по такой "длинной" книге? Не могу понять. Но с этой главы начались конспекты по теме "классы в Питон".
Здесь собраны простейшие примеры... Вот здесь можно посмотреть первоисточник книги М.Лутца "Изучаем Питон" (2011 pdf)
Здесь собраны простейшие примеры... Вот здесь можно посмотреть первоисточник книги М.Лутца "Изучаем Питон" (2011 pdf)
In [6]:
# Первый пример (стр. 711)
class C1(): # Создать и связать класс C1
def setname(self, who): # Присвоить: C1.setname
self.name = who # self – либо I1, либо I2
I1 = C1() # Создать два экземпляра
I2 = C1()
I1.setname('bob') # Записать ‘bob’ в I1.name
I2.setname('mel') # Записать ‘mel’ в I2.name
I1.name # Выведет ‘bob’
Out[6]:
Поговорим о объектах "класс" и немного об "экземплярах класса" - это другие объекты¶
Самый простой в мире класс на языке Python (стр. 721)¶
In [26]:
class rec: pass # Объект пустого пространства имен
... мы можем приступать к присоединению атрибутов, выполняя операции присваивания из-за пределов класса:
In [31]:
rec.name = 'Bob' # Так же для объектов с атрибутами
rec.age = 40
In [33]:
rec.age
Out[33]:
In [35]:
x = rec() # Экземпляры наследуют имена из класса
y = rec()
In [36]:
x.name, y.name # Сейчас имена хранятся только в классе
Out[36]:
In [38]:
x.name = 'Sue' # Но присваивание изменит только объект x
rec.name, x.name, y.name
Out[38]:
In [39]:
rec.__dict__.keys()
Out[39]:
In [40]:
x.__dict__.keys()
Out[40]:
In [41]:
list(x.__dict__.keys()) # В Python 2.6 функцию list() можно не использовать
Out[41]:
In [42]:
list(y.__dict__.keys())
Out[42]:
In [43]:
x.__class__
Out[43]:
In [44]:
rec.__bases__ # () пустой кортеж в Python 2.6
Out[44]:
In [46]:
def upperName(self):
return self.name.upper() # Аргумент self по-прежнему необходим
In [47]:
upperName(x) # Вызов, как обычной функции
Out[47]:
Однако, если эту простую функцию присвоить атрибуту нашего класса, она станет методом, вызываемым из любого экземпляра (а также через имя самого класса при условии, что функции вручную будет передан экземпляр):
In [48]:
rec.method = upperName
In [49]:
x.method() # Вызвать метод для обработки x
Out[49]:
In [50]:
rec.method(x) # Можно вызвать через имя экземпляра или класса
Out[50]:
In [51]:
y.method() # То же самое, но в self передается y
Out[51]:
In []:
In [13]:
class FirstClass: # Определяет объект класса
def setdata(self, value): # Определяет метод класса
self.data = value # self – это экземпляр
def display(self):
print(self.data) # self.data: данные экземпляров
In [14]:
x = FirstClass() # Создаются два экземпляра
y = FirstClass() # Каждый является отдельным пространством имен
In [7]:
from IPython.display import Image
Image(filename='C:\\Users\\kiss\\Pictures\\for_blogs\\py_c_fc.PNG')
Out[7]:
In [16]:
x.setdata('King Arthur') # Вызов метода: self – это x
y.setdata(3.14159) # Эквивалентно: FirstClass.setdata(y, 3.14159)
In [17]:
x.display()
y.display()
In [22]:
x.data, y.data
Out[22]:
In [21]:
FirstClass.data
In []:
x.data = “New value” # Можно получать/записывать значения атрибутов
x.display() # И за пределами класса тоже
In []:
x.anothername = “spam” # Здесь также можно создавать новые атрибуты
In []:
class FirstClass: # Определяет объект класса
def setdata(self, value): # Определяет метод класса
self.data = value # self – это экземпляр
def display(self):
print(self.data) # self.data: данные экземпляров
In []:
x = FirstClass() # Создаются два экземпляра
y = FirstClass() # Каждый является отдельным пространством имен
Классы – это атрибуты в модулях (стр. 714)¶
In []:
> class SecondClass(FirstClass): # Наследует setdata
def display(self): # Изменяет display
print(‘Current value = “%s”’ % self.data)
In []:
z = SecondClass()
z.setdata(42) # Найдет setdata в FirstClass
z.display() # Найдет переопределенный метод в SecondClass
Комментариев нет:
Отправить комментарий