Latest web development tutorials

Python3 объектно-ориентированного

Python был разработан с самого начала является объектно-ориентированный язык, и как таковой, создать класс и объекты в Python очень легко. В этом разделе мы будем подробно объектно-ориентированное программирование на языке Python.

Если вы не были подвержены объектно-ориентированный язык программирования, то вам, возможно, придется сначала понять некоторые из основных особенностей объектно-ориентированных языков, сформированных в сознании внутри базовой концепции объектно-ориентированного, который поможет вам легко узнать Python объектно-ориентированное программирование.

Далее, давайте рассмотрим простой понимание объектно-ориентированных под некоторыми основными функциями.


Объектно-ориентированной технологии Обзор

  • Класс (класс): используется для описания коллекции имеют те же свойства и методы объектов. Он определяет набор свойств и методов, общих для каждого объекта. Объекты являются экземплярами классов.
  • Класс: переменные переменные класса является общим по всему инстанцирован объекта. Переменные класса определены и вне функции в классе в. Переменные класса обычно не используются в качестве переменных экземпляра.
  • Члены данных: переменные класса или переменные экземпляра для соответствующих классов обработки данных и объектов экземпляра.
  • Переопределения: Если вы не можете удовлетворить потребности подкласса наследует от метода родительского класса, он может быть переписан, этот процесс называется метод наложения (переопределение), также известный как метод наиважнейшей.
  • Примеры переменных: переменные , определенные в методе, только роль класса текущего экземпляра.
  • Наследование: То есть производный класс (производный класс) наследует (базовый класс) поля и методы базового класса. Наследование также позволяет производный объект класса в качестве объекта лечения базового класса. Например, есть такая конструкция: тип объекта, который является производным от класса собак животных, который является аналогом "представляет собой (это-а)" отношения (рис пример, собака для животных).
  • Инстанцировать: создать экземпляр класса, конкретного класса объектов.
  • Методы: Функции класса определены.
  • Объект: структура данных экземпляра с помощью определения класса. Объекты данных включают в себя два члена (класс и переменные экземпляра) и методы.

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

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

Объекты могут содержать любое количество и тип данных.

определение класса

Синтаксис выглядит следующим образом:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

После того, как экземпляры класса создаются, вы можете использовать его свойства, на самом деле, после того как вы создаете класс, вы можете получить доступ к его свойствам с помощью имени класса.

объект класса

Объекты класса поддерживают два вида операций: ссылки на атрибуты и Инстанцирование.

Атрибут ссылки использовать Python для всех атрибутов ссылается на стандартныйсинтаксис: obj.name.

После того, как объект класса был создан атрибут класса имен все имена являются допустимыми именами. Таким образом, если определение класса выглядит следующим образом:

#!/usr/bin/python3

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

Инстанцировать класс:

# 实例化类
x = MyClass()
# 访问类的属性和方法

Над создает новый экземпляр класса и присваивает этот объект локальной переменной х, пустой объект.

Выше вывода программы:

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

Многие классы, как создавать объекты в известном начальном состоянии. Поэтому класс может определить названный __init __ () специальный метод (конструктор), как это:

def __init__(self):
    self.data = []

Класс определяет __init __ () метод, то оператор экземпляра класса будет автоматически вызывать __init __ () метод. Таким образом, в данном примере, может быть, чтобы создать новый экземпляр:

x = MyClass()

Конечно, метод __init __ () может иметь аргументы, параметры __init __ () передается оператору создания экземпляра класса. Например:

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

методы класса

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

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('w3big',10,30)
p.speak()

Выше вывода программы:

w3big 说: 我 10 岁。

унаследовать

Python также поддерживает наследование классов, если язык не поддерживает наследование, класс имеет мало смысла. Определение производного класса следующим образом:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

Обратите внимание, что порядок базового класса в скобках, если базовый класс имеет то же имя метода, но без указания подклассы, Python слева направо метод поиска, который не найден в подклассе, слева направо, чтобы найти базовый класс содержит методы.

BaseClassName (пример имени базового класса) должны быть определены в производном классе области. В дополнение к классам, вы можете использовать выражение, базовый класс определен в другом модуле, который очень полезен для:

class DerivedClassName(modname.BaseClassName):

примеров

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))



s = student('ken',10,60,3)
s.speak()

Выше вывода программы:

ken 说: 我 10 岁了,我在读 3 年级

Множественное наследование

Python поддерживает ограниченную форму множественного наследования. определение множественный наследование классов выглядит следующим образом:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

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

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

#另一个类,多重继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

#多重继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法

Выше вывода программы:

我叫 Tim,我是一个演说家,我演讲的主题是 Python

метод переопределяет

Если функция вы метод родительского класса не может удовлетворить ваши потребности, вы можете переписать ваш метод родительского класса в подклассе, примеры заключаются в следующем:

#!/usr/bin/python3

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')

class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

Выше вывода программы:

调用子类方法

Атрибуты класса и методы

Частный класс недвижимости

__private_attrs: начиная с двух символов подчеркивания , заявляющие , что собственность является частной и не могут быть использованы или доступны непосредственно в классе извне. Самостоятельно .__ private_attrs при использовании в качестве метода класса.

методы класса

В земном интерьере, используйте Защиту ключевое слово может быть определен как метод класса с общим определением различных функций, методы класса должны включать в себя параметр, и в качестве первого параметра

Частные методы класса

__private_method: первые два подчеркивание, метод объявлен как частные методы в классе не может вызывать извне. Внутренний класс slef вызов .__ private_methods.

примеров

Частная собственность экземпляра класса следующим образом:

#!/usr/bin/python3

class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 报错,实例不能访问私有变量

Выше вывода программы:

1
2
2
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print (counter.__secretCount)  # 报错,实例不能访问私有变量
AttributeError: 'JustCounter' object has no attribute '__secretCount'

Закрытый метод экземпляра класса следующим образом:

#!/usr/bin/python3

class Site:
	def __init__(self, name, url):
		self.name = name       # public
		self.__url = url   # private

	def who(self):
		print('name  : ', self.name)
		print('url : ', self.__url)

	def __foo(self):          # 私有方法
		print('这是私有方法')

	def foo(self):            # 公共方法
		print('这是公共方法')
		self.__foo()

x = Site('本教程', 'www.w3big.com')
x.who()        # 正常输出
x.foo()        # 正常输出
x.__foo()      # 报错

Результаты приведенных выше примеров:

Собственные методы класса:

  • __init__: Конструктор вызывается , когда создается объект
  • __del__: деструкторов, объекты релиз
  • __repr__: печать, преобразование
  • __setitem__: в соответствии с поручением индекса
  • __getitem__: Получает значение индекса
  • __len__: получить длину
  • __cmp__: операция сравнения
  • __call__: вызов функции
  • __add__: добавить операцию
  • __sub__: Вычитание
  • __mul__: умножение
  • __div__: операция деления
  • __mod__: оператор осталось
  • __pow__: вызываемая сторона

Оператор Перегрузки

Python также поддерживает перегрузку операторов, что я могу быть перегружен запатентованные методы класса, примеры заключаются в следующем:

#!/usr/bin/python3

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

Результаты выполнения приведенного выше кода заключаются в следующем:

Vector(7,8)