Определение к какому классу принадлежит объект. Функции type и isinstance



Иногда возникает необходимость узнать к какому классу принадлежит тот или иной объект. Это можно сделать, используя функцию type. Например, создадим какой-либо класс, а потом проверим его тип:

>>> class AD:

... ...

>>> type(AD)

<class 'type'>

Также функцию type можно использовать в условиях и условных операторах:

>>> a = tuple()

>>> type(a) in [list, tuple, dict, set]

True

>>> type(a) in [float, int, str, bool]

False

>>> if (type(x) is set) and (type(y) is list or type(y) is set or type(y) is tuple):

... ...

>>> if (type(x) is set) and (type(y) in [list, set, tuple]):

... ...

Если нужно узнать, является ли какой-либо объект экземпляром данного класса, мы можем это сделать, используя функцию isinstance. Давайте создадим класс NewClass, объект этого класса и проверим, является ли созданный нами объект экземпляром класса NewClass, а также какого-нибудь другого класса:

>>> class NewClass:

... pass

...    

>>> a = NewClass()

>>> isinstance(a, NewClass)

True

>>> isinstance(a, int)

False

 

Объект, как экземпляр класса

Для создания объекта — экземпляра класса (то есть, инстанцирования класса), достаточно вызвать класс по имени и задать параметры конструктора:

class Point:

    def __init__(self, x, y, z):

        self.coord = (x, y, z)

    def __repr__(self):

        return "Point(%s, %s, %s)" % self.coord

>>> p = Point(0.0, 1.0, 0.0)

>>> p

Point(0.0, 1.0, 0.0)

Переопределив классовый метод __new__, можно контролировать процесс создания экземпляра. Этот метод вызывается до метода __init__ и должен вернуть новый экземпляр, либо None (в последнем случае будет вызван __new__ родительского класса). Метод __new__ используется для управления созданием неизменчивых (immutable) объектов, управления созданием объектов в случаях, когда __init__ не вызывается, например, при десериализации (unpickle). Следующий код демонстрирует один из вариантов реализации шаблона Одиночка:

>>> class Singleton(object):

   obj = None # Атрибут для хранения единственного экземпляра

   def __new__(cls,*dt,**mp):      # класса Singleton.

      if cls.obj is None:          # Если он еще не создан, то

         cls.obj = object.__new__(cls,*dt,**mp) # вызовем __new__ родительского класса

      return cls.obj               # вернем синглтон

...

>>> obj = Singleton()

>>> obj.attr = 12

>>> new_obj = Singleton()

>>> new_obj.attr                  

12

>>> new_obj is obj        # new_obj и obj - это один и тот же объект

True

Атрибуты (поля)

Данные класса представляются атрибутами. Любой класс должен определять атрибуты, сохраняющие состояние каждого объекта, экземпляр которого окажется создан на основе этого класса. Если рассматривать класс Person, то он определяет атрибуты для name и address.

 Атрибуты – это переменные, которые определены внутри определения класса и доступны через имя класса или объекта (экземпляра) класса.

Определения атрибутов — обычные операторы присваивания, которые связывают некоторые значения с именами атрибутов. Атрибут может содержать значение любого типа.

Данные класса и данные экземпляра класса

class Simple (object):
variable = 25

def change(self):
   print(self.variable)
   self.variable += 15
   print(self.variable)
   print(Simple.variable)
   del self.variable
   print(self.variable)


simple = Simple()
simple.change()

 

Методы

Методы реализуют требуемое поведение класса. Каждый объект, экземпляр которого окажется создан на основе этого класса, будет содержать методы, определяемые этим же классом. Методы могут реализовывать поведения, вызываемые из других объектов (с помощью сообщений) либо обеспечивать основное, внутреннее поведение класса. Внутренние поведения — это закрытые методы, которые недоступны другим объектам. В классе Person поведениями являются getName(), setName(), getAddress() и setAddress(). Эти методы позволяют другим объектам инспектировать и изменять значения атрибутов соответствующего объекта. Это методика, широко распространенная в сфере объектно-ориентированных систем. Во всех случаях доступ к атрибутам в объекте должен контролироваться самим этим объектом — никакие другие объекты не должны напрямую изменять значения атрибутов этого объекта.

Метод

Синтаксис описания метода ничем не отличается от описания функции, разве что его положением внутри класса и характерным первым формальным параметром self, с помощью которого внутри метода можно ссылаться на сам экземпляр класса (название self является оглашением, которого придерживаются программисты на Python):

class MyClass(object):

def mymethod(self, x):

   return x == self._x

В этом примере можно увидеть, что в Питоне ссылка на экземпляр класса передается в методы явным образом, как первый аргумент. Здесь видно следование первому принципу философии Питона: явное лучше неявного.

 

Статический метод

Статические методы в Python являются синтаксическими аналогами статических функций в основных языках программирования. Они не получают ни экземпляр (self), ни класс (cls) первым параметром. Для создания статического метода (только «новые» классы могут иметь статические методы) используется декоратор staticmethod

>>> class D(object): 

  @staticmethod

  def test(x):

      return x == 0

...

>>> D.test(1) # доступ к статическому методу можно получать и через класс

False

>>> f = D()

>>> f.test(0) # и через экземпляр класса

True

Статические методы реализованы с помощью свойств (property). В Python статические методы часто используются для того, чтобы функция не засоряла глобальное пространство имен модуля модуля

Метод класса

Классовые методы в Python занимают промежуточное положение между статическими и обычными. В то время как обычные методы получают первым параметром экземпляр класса, а статические не получают ничего, в классовые методы передается класс. Возможность создания классовых методов является одним из следствий того, что в Python классы также являются объектами. Для создания классового (только «новые» классы могут иметь классовые методы) метода можно использовать декоратор classmethod

>>> class A(object): 

def __init__(self, int_val):

     self.val = int_val + 1

@classmethod

def fromString(cls, val): # вместо self принято использовать cls

     return cls(int(val))

...

>>> class B(A):pass

...

>>> x = A.fromString("1")

>>> print x.__class__.__name__

A

>>> x = B.fromString("1")

>>> print x.__class__.__name__

B

Инкапсуляция

Инкапсуляция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (что у него внутри?), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public. Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal. Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием). Сокрытие реализации целесообразно применять в следующих случаях: предельная локализация изменений при необходимости таких изменений, прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.

Инкапсуляция — ограничение доступа к составляющим объект компонентам (методам и переменным). Инкапсуляция делает некоторые из компонент доступными только внутри класса.

 

Инкапсуляция. Концепция сокрытия как бы в «капсуле» всей информации об объекте, то есть объединение в некое целое данных и процедур (методов) их обработки. Единицей инкапсуляции в Объектно-Ориентированном Проектировании является объект, в котором содержатся и данные, определяющие состояние объекта, и методы, которые объект может выполнить.

Инкапсуляция подразумевает: алгоритмы работы с данными хранятся вместе с данными.

Главное в инкапсуляции – не надо путать инкапсуляцию и сокрытие данных.


Дата добавления: 2020-01-07; просмотров: 379; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!