Объект класса и конструктор класса в Python.
Содержание:- Что такое объект класса;
- Конструктор класса
__init__()
.
Что такое объект класса.
Объект класса в Python представляет собой ИМЯ класса, созданного (определенного/записанного) в коде. Объекты класса поддерживают два вида операций: ссылки на атрибуты и создание экземпляров.
Ссылки на атрибуты используют стандартный синтаксис, используемый для всех ссылок на атрибуты в Python: obj.name
. Допустимые имена атрибутов — это все имена, которые были определены в пространстве имен класса при создании объекта класса.
Итак, если определение класса выглядит так:
class MyClass: """Простой пример класса""" i = 12345 def f(self): return 'hello world' # `MyClass` - это объект класса >>> MyClass.i # 12345 >>> MyClass.f # <function MyClass.f at 0x7f3c1fd6e840>
то имя MyClass
— это объект класса, а MyClass.
и i
MyClass.f
являются действительными ссылками на атрибуты класса, возвращая целое число и функциональный объект соответственно. Атрибуты объекта класса также могут быть присвоены, так что можно изменить значение
путем операции присвоения. __doc__
также является допустимым атрибутом, возвращающим строку документации "Простой пример класса"
, принадлежащую классу MyClass
.
Экземпляр класса использует нотацию функций. Представьте, что объект класса — это функция без параметров, которая возвращает новый экземпляр класса. Пример ниже создает новый экземпляр класса и присваивает этот объект локальной переменной x
:
x = MyClass() >>> x.i # 12345 >>> x.f() # 'hello world'
Конструктор класса
__init__()
.Объекты классов обычно создают с экземплярами, настроенными на определенное начальное состояние.
__init__()
, который выполняется при создании экземпляра класса. Метод .__init__()
принимает новый объект в качестве первого аргумента self
.class MyClass: """Простой пример класса""" i = 12345 def __init__(self): self.data = [] def f(self): return 'hello world'
Когда в классе определен метод.__init__()
, то экземпляр класса автоматически вызывает .__init__()
для вновь созданного экземпляра класса. Таким образом, в примере ниже, новый инициализированный экземпляр может быть получен с помощью:
>>> x = MyClass() >>> x.data # []
Метод __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)Важно отметить
, что без учета self
, аргументы метода .__init__()
— это те же самые аргументы, которые передаются при вызове конструктора класса. Таким образом, сигнатура .__init__()
определяет сигнатуру конструктора класса.
Имейте в виду, что конструктор класса .__init__()
не должен явно возвращать ничего отличного от None
, иначе будет вызываться исключение TypeError
:
>>> class Complex: ... def __init__(self, realpart, imagpart): ... self.r = realpart ... self.i = imagpart ... return realpart + imagpart >>> x = Complex(3.0, -4.5) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # TypeError: __init__() should return None, not 'float'
В конструкторе класса .
можно выполнить любое преобразование входных аргументов, чтобы правильно инициализировать атрибуты экземпляра. Например, если пользователи будут использовать класс __init__()
Rectangle
, то например, можно проверить предоставленные ширину и высоту, для того, чтобы убедиться в их верном значении:
>>> class Rectangle: ... def __init__(self, width, height): ... if not (isinstance(width, (int, float)) and width > 0): ... raise ValueError(f"Необходима положительная ширина, получена: {width}") ... self.width = width ... if not (isinstance(height, (int, float)) and height > 0): ... raise ValueError(f"Необходима положительная высота, получена: {height}") ... self.height = height >>> rectangle = Rectangle(-21, 42) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line 4, in __init__ # ValueError: Необходима положительная ширина, получена: -21
Теперь предположим, что используется наследование для создания пользовательской иерархии классов и повторного использования некоторых функций в своем коде. Если подклассы предоставляют конструктор
.__init__()
, то он должен явно вызывать метод .__init__()
super()
, как в следующем примере:>>> class Person: ... def __init__(self, name, birth_date): ... self.name = name ... self.birth_date = birth_date >>> class Employee(Person): ... def __init__(self, name, birth_date, position): ... super().__init__(name, birth_date) ... self.position = position >>> john = Employee("John Doe", "2001-02-07", "Разработчик Python") >>> john.name # 'John Doe' >>> john.birth_date # '2001-02-07' >>> john.position # 'Разработчик Python'
Классы | Scala Documentation
Info: JavaScript is currently disabled, code tabs will still work, but preferences will not be remembered.
Классы в Scala являются основами для создания объектов. Они могут содержать методы, константы, переменные, типы, объекты, трейты и классы, которые в совокупности называются членами. Типы, объекты и трейты будут рассмотрены позже в ходе нашего обзора.
Объявление класса
Минимальное объявление класса — это просто ключевое слово class
и его имя. Имена классов должны быть написаны с заглавной буквы.
class User val user1 = new User
Ключевое слово new
используется для создания экземпляра класса. User
имеет конструктор по умолчанию, который не принимает аргументов, так как конструктор не был определен. Однако обычно используется и конструктор, и тело класса. Пример объявления класса Point приведен ниже:
class Point(var x: Int, var y: Int) { def move(dx: Int, dy: Int): Unit = { x = x + dx y = y + dy } override def toString: String = s"($x, $y)" } val point1 = new Point(2, 3) point1.x // 2 println(point1) // prints (2, 3)
В этом классе у Point
есть четыре члена: переменные x
и y
и методы move
и toString
.
В отличие от многих других языков, основной конструктор находится в сигнатуре класса (var x: Int, var y: Int)
. Метод move
принимает два целочисленных аргумента и возвращает значение Unit ()
— это пустое множество, которое не содержит никакой информации. Примерно соответствует void
в Java-подобных языках. С другой стороны, toString
не принимает никаких аргументов, а возвращает значение String
. Поскольку toString
toString
из AnyRef
, он помечается ключевым словом override
.Конструкторы
Конструкторы могут иметь необязательные параметры, если указать их значения по умолчанию как в примере:
class Point(var x: Int = 0, var y: Int = 0) val origin = new Point // x и y оба равны 0 val point1 = new Point(1) println(point1.x) // выводит 1
В этой версии класса Point
, x
и y
имеют значение по умолчанию 0
, поэтому аргументов не требуется. Однако, поскольку конструктор считывает аргументы слева направо, если вы просто хотите передать значение y
, то вам нужно будет указать задаваемый параметр.
class Point(var x: Int = 0, var y: Int = 0) val point2 = new Point(y=2) println(point2.y) // выводит 2
Что также является хорошей практикой для повышения ясности кода.
Скрытые члены и синтаксис Геттер/Сеттер (получатель/установщик значений)
По умолчанию члены класса являются открытыми для внешнего доступа (публичными). Используйте модификатор private
, чтобы скрыть их от внешнего доступа.
class Point { private var _x = 0 private var _y = 0 private val bound = 100 def x = _x def x_= (newValue: Int): Unit = { if (newValue < bound) _x = newValue else printWarning } def y = _y def y_= (newValue: Int): Unit = { if (newValue < bound) _y = newValue else printWarning } private def printWarning = println("WARNING: Out of bounds") } val point1 = new Point point1.x = 99 point1.y = 101 // выводит предупреждение (printWarning)
В данной версии класса Point
данные хранятся в скрытых переменных _x
и _y
. Существуют методы def x
и def y
для доступа к скрытым данным. Методы
и def y_=
(сеттеры) предназначены для проверки и установки значения _x
и _y
. Обратите внимание на специальный синтаксис для сеттеров: метод _=
применяется к имени геттера.
Первичные параметры конструктора с параметрами val
и var
являются общедоступными. Однако, поскольку val
— это константа, то нельзя писать следующее.
class Point(val x: Int, val y: Int) val point = new Point(1, 2) point.x = 3 // <-- не компилируется
Параметры без val
или var
являются скрытыми от внешнего доступа и видимы только внутри класса.
class Point(x: Int, y: Int) val point = new Point(1, 2) point.x // <-- не компилируется
← previous next →
Contributors to this page:
c++ — Использовать класс как тип в другом конструкторе классов
Я хотел бы использовать класс Point в другом классе Rect.
класс Точка { интервал х, у; публичный: Точка (целое число пикселей, число ру){ х = пиксели; у = ру; } }; класс Rect { Точка top_left; точка нижняя_правая; публичный: Прямоугольник (точка p1, точка p2){ верхний_левый = p1; нижнее_правое = p2; } };
сообщение об ошибке: « main.cpp:31:30: ошибка: нет соответствующей функции для вызова ‘Rect::Point::Point()’ «. Насколько я понимаю, метод конструктора класса Rect использует два параметра типа Point для создания экземпляра объекта Rect. Я предполагаю, что я не могу использовать «Point» в качестве типа, поскольку мне это кажется компилятором, который хочет вызвать функцию. Сообщение об ошибке не помогает мне, поэтому я надеюсь, что вы поможете.Спасибо за это заранее. 1
Элементы инициализируются до запуска тела конструктора. Когда вы пишете:
Прямоугольник (точка p1, точка p2){ верхний_левый = p1; нижнее_правое = p2; }
Затем перед выполнением конструктора инициализируются члены top_left
и bottom_right
. Поскольку Point
не имеет конструктора по умолчанию, члены не могут быть инициализированы.
Чтобы инициализировать члены с помощью конструктора, вы должны использовать список инициализаторов членов:
Rect (точка p1, точка p2): top_left(p1), bottom_right(p2) { }
Ошибку также можно предотвратить, предоставив инициализаторы по умолчанию для членов:
класс прямоугольный { Точка top_left{0,0}; Указать нижняя_правая сторона{0,0}; публичный: Прямоугольник (точка p1, точка p2){ верхний_левый = p1; нижнее_правое = p2; } };
Или предоставив конструктор по умолчанию для Point
. Конструктор по умолчанию — это конструктор, который можно вызывать без параметров. Однако в любом случае вам следует предпочесть список инициализаторов членов, а не присваивание в теле конструктора, потому что инициализация + присваивание дороже, чем только инициализация.
0
Проблема заключается в том, что при создании объекта Rect
переменные-члены создаются и инициализируются до выполнения тела конструктора Rect
.
Поскольку нет явной инициализации переменных-членов Point
, они должны быть конструируемыми по умолчанию, а это не так, потому что у вас нет конструктора Point
по умолчанию.
Есть несколько возможных решений, самое простое из которых:
Создайте конструктор по умолчанию
Point
. Он не должен ничего делать и может быть сгенерирован компилятором (но вы все равно должны указать компилятору сгенерировать его):класс Точка { публичный: Точка() = по умолчанию; .
.. };
Несмотря на то, что
Point
теперь может быть создана по умолчанию, элементыx
иy
останутся неинициализированными.
Но я бы порекомендовал другое решение:
Создайте список инициализаторов конструктора
Rect
для инициализации переменных-членовRect
:класс прямоугольный { Точка top_left; точка нижняя_правая; публичный: Прямоугольник(точка p1, точка p2) : верхний_левый (p1), нижний_правый (p2) { // Пустой } ... };
Со вторым решением конструктор по умолчанию Point
не требуется.
Что касается того, почему для 9 не создан конструктор по умолчанию0025 Point , потому что вы объявили другой конструктор. Это запрещает компилятору генерировать собственный конструктор по умолчанию (без указания сделать это, как в первом варианте).
1
В данном примере члены данных top_left
и bottom_right
инициализированы по умолчанию до выполнения тела Rect::Rect (Point, Point)
. Это означает в вашем примере для утверждений:
Точка top_left; //этому оператору нужен ctor по умолчанию в вашем примере, потому что этот элемент данных инициализирован по умолчанию Point bottom_right;//этому оператору нужен ctor по умолчанию в вашем примере, потому что этот элемент данных инициализирован по умолчанию
для работы конструктора по умолчанию Требуется Point::Point()
.
Но проблема заключается в том, что, поскольку у вас есть пользовательский конструктор для вашего класса Point
, компилятор не будет синтезировать ctor по умолчанию Point::Point()
.
Есть 2 способа решить эту проблему.
Решение 1
Во-первых, вы можете добавить конструктор по умолчанию для класса Point
, как показано ниже:
class Point { интервал х, у; публичный: Точка (целое число пикселей, число ру){ х = пиксели; у = ру; } // конструктор по умолчанию Точка(): х(0), у(0){ } };
Рабочая демонстрация.
В приведенном выше модифицированном коде я добавил конструктор по умолчанию, который использует список инициализаторов конструктора для инициализации элементов данных x
и y
.
Решение 2
Мы также можем использовать список инициализаторов конструктора в конструкторе Rect::Rect(Point, Point)
для инициализации элементов данных путем передачи аргументов вместо их инициализации по умолчанию.
класс прямоугольный { Точка top_left; точка нижняя_правая; публичный: //используем список инициализаторов конструктора для инициализации элементов данных путем передачи аргументов вместо их инициализации по умолчанию Прямоугольник (точка p1, точка p2): top_left(p1), bottom_right(p2){ } };
Рабочая демонстрация.
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Конструктор класса модели — AWS DeepLens
Создает объект awscam.
для выполнения вывода в определенном типе
процессор и конкретная среда выполнения вывода. Для моделей, не скомпилированных в Neo, Model
Объект модели
предоставляет возможность синтаксического анализа необработанных выходных данных для
возвращать результаты вывода, специфичные для модели.
Синтаксис запроса
импорт awscam model = awscam.Model(model_topology_file, loading_config, runtime=0)
Параметры
model_topology_file
— Обязательный. Когдаruntime=0
, значение этого параметра является путем к оптимизированному вывод файла модели (.xml) методом mo.optimize. Когда время выполнения=1, это значение параметра — имя папки, содержащей скомпилированную модель артефакты, среди которых .json файл, а .params и .so .
Неокомпилированные модели поддерживают только тип модели Classification. Другой модели поддерживают классификацию, сегментацию и мультибокс Single Shot Детектор (SSD).
Примечание
При развертывании модели SSD, обученной SageMaker, необходимо сначала запустить
deploy.py
(доступно на https://github.com/apache/incubator-mxnet/tree/v1.x/example/ssd/) для преобразования артефакта модели в развертываемую модель. После клонирования или загрузки репозитория MXNet, запуститьgit reset --hard 73d88974f8bca1e68441606fb0787a2cd17eb364
перед вызовомdeploy.py
для преобразования модели, если последняя версия не работает.loading_config
(dict) — обязательно. Указывает, является ли модель должна быть загружена в GPU или CPU.Формат этого параметра словарь.
Допустимые значения:
{"GPU":1}
— Загружает модель в GPU. Бежать вывод в среде выполнения Neo (runtime=1
), вы должны выберите GPU ({'GPU':1}
).{"GPU":0}
—Загружает модель в ЦП.
среда выполнения
int — необязательно. Указывает среду выполнения, в которой выполняется вывод.Допустимые значения:
Javascript отключен или недоступен в вашем браузере.
Чтобы использовать документацию Amazon Web Services, должен быть включен Javascript.