Как передать в метод экземпляр класса
Перейти к содержимому

Как передать в метод экземпляр класса

Как передать объект в метод java

Для передачи объекта в метод необходимо объявить параметр метода, который будет принимать объект нужного типа. Например:

public void someMethod(MyObject obj)  // тело метода > 

В данном примере метод someMethod принимает объект класса MyObject , передаваемый в качестве аргумента метода. Чтобы передать объект в метод, необходимо создать экземпляр класса, и использовать его в качестве аргумента метода. Например:

MyObject obj = new MyObject(); someMethod(obj); 

Здесь мы создали экземпляр класса MyObject и передали его в метод someMethod . Внутри метода someMethod мы можем работать с переданным объектом, вызывая его методы или обращаясь к его полям.

[python]Экземпляр класса как параметр по умолчанию

А че нет, замыкания же. Только param инициализируется один раз, это надо помнить.

creepnee
( 28.09.10 00:11:22 MSD )

мочь то можно, но это рассадник багов.

Zubchick ★
( 28.09.10 00:14:12 MSD )
Ответ на: комментарий от Zubchick 28.09.10 00:14:12 MSD

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

swelf ★
( 28.09.10 00:24:04 MSD ) автор топика

Глобальная переменная, нэ? Ее хотя бы поменять можно.

baverman ★★★
( 28.09.10 04:36:43 MSD )

а не судьба вот так сделать:

[code] def f(param = null): if !a a = A() a.bla = ‘bla’ [/code]

питона не знаю, но, думаю, суть ясна

anonymous
( 28.09.10 08:01:51 MSD )
Ответ на: комментарий от swelf 28.09.10 00:24:04 MSD

true_admin ★★★★★
( 28.09.10 11:20:07 MSD )
Ответ на: комментарий от anonymous 28.09.10 08:01:51 MSD

анонимус прав на все 100. Так и делают когда хочется дефолтовым параметром передать, например пустой список. Но с объектом сложней, они могут иметь отличные от А() параметры. Вообще изменять объекты внутри функций не являющихся методами черевато, но никто не говорит, что этого нельзя делать.

Zubchick ★
( 28.09.10 11:29:42 MSD )
Ответ на: комментарий от true_admin 28.09.10 11:20:07 MSD

«Глобальный синглтон» в python — это модуль. Только и всего.

shylent ★
( 28.09.10 12:12:18 MSD )
Ответ на: комментарий от shylent 28.09.10 12:12:18 MSD

не обязательно. И там есть свои нюансы.

true_admin ★★★★★
( 28.09.10 13:02:34 MSD )
Ответ на: комментарий от true_admin 28.09.10 13:02:34 MSD

Эх, ну вы же понимаете, что про все что угодно можно сказать, что там «есть свои нюансы» без всяких объяснений.

Просто, в самом деле, наипростейший вариант реализации синглтона без всяких вывертов (тем более, что все эти выверты без проблем в python обходятся, благодаря его динамизму), это объект внутри модуля.

shylent ★
( 28.09.10 14:03:27 MSD )
Ответ на: комментарий от shylent 28.09.10 14:03:27 MSD

В моём понимании класс тоже может быть синглтоном и я бы загнал все глобальные переменные в класс(для красоты). Про нюанс я имел в виду что если сделать «from module import *», где * это простые типы данных типа int, str итп то работать не будет т.к. они при присвоении значения получится своя локальная копия переменной которая и будет изменена.

true_admin ★★★★★
( 28.09.10 14:32:50 MSD )
Ответ на: комментарий от true_admin 28.09.10 14:32:50 MSD

про синглтоны почитаю потом какнить, пока решил просто сделать функцию методом класса.

Как передать указатель на метод экземпляра класса, как параметр конструктора?

Добрый вечер, подскажите.
Я написал класс чтения из pipe и заметил, что сообщения дробятся, по этому я решил создать класс буферизатора, который будет накапливать прочтенные данные. Класс, читающий данные из pipe, в своем конструкторе имеет параметр, указывающий, какую функцию надо вызвать, когда приходят данные и туда я хочу передать функцию из класса буферизатора. Напрямую это сделать нельзя, так как функция экземпляра не является static. Я начал читать про путь с использованием подставного callback, но потом наткнулся, что можно использовать std::function и std::bind. Вот это я и попытался сделать, но так и не понял, как довести дело до ума.
В классе, который читает данные из pipe я определил

class NamedPipeClass < NamedPipeClass(char* _pipeName, bool isClient, std::functionReadCallBack) < . onReadCallback = ReadCallBack; >; std::function onReadCallback; >

И создавая экземпляр класса

MessageCollectorClass* msgCollector = new MessageCollectorClass(); NamedPipeClass* hltPipe = new NamedPipeClass(myfifo, true, std::bind(&msgCollector::AddData, this, std::placeholders_1));

но это не правильно. Подскажите, как это сделать корректно?

  • Вопрос задан более трёх лет назад
  • 778 просмотров

Объект класса и конструктор класса в Python

Объект класса в Python представляет собой ИМЯ класса, созданного (определенного/записанного) в коде. Объекты класса поддерживают два вида операций: ссылки на атрибуты и создание экземпляров.

Ссылки на атрибуты используют стандартный синтаксис, используемый для всех ссылок на атрибуты в Python: obj.name . Допустимые имена атрибутов — это все имена, которые были определены в пространстве имен класса при создании объекта класса.

Итак, если определение класса выглядит так:

class MyClass: """Простой пример класса""" i = 12345 def f(self): return 'hello world' # `MyClass` - это объект класса >>> MyClass.i # 12345 >>> MyClass.f #

то имя MyClass — это объект класса, а MyClass.i и MyClass.f являются действительными ссылками на атрибуты класса, возвращая целое число и функциональный объект соответственно. Атрибуты объекта класса также могут быть присвоены, так что можно изменить значение MyClass.i путем операции присвоения. __doc__ также является допустимым атрибутом, возвращающим строку документации «Простой пример класса» , принадлежащую классу MyClass .

Экземпляр класса использует нотацию функций. Представьте, что объект класса — это функция без параметров, которая возвращает новый экземпляр класса. Пример ниже создает новый экземпляр класса и присваивает этот объект локальной переменной x :

x = MyClass() >>> x.i # 12345 >>> x.f() # 'hello world' 

Конструктор класса __init__() .

Объекты классов обычно создают с экземплярами, настроенными на определенное начальное состояние. Для этого в классе Python определятся специальный метод «конструктор класса» с именем __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__() может иметь аргументы для большей гибкости. В этом случае аргументы, переданные оператору создания класса, передаются в метод __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 "", line 1, in # 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 "", line 1, in # File "", 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' 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Пространство имен и область видимости в классах
  • Определение классов
  • Объект класса и конструктор класса
  • Создание экземпляра класса
  • Метод экземпляра класса
  • Что такое метод класса и зачем нужен
  • Что такое статический метод в классах Python и зачем нужен
  • Атрибуты класса и переменные экземпляра класса
  • Кэширование методов экземпляра декоратором lru_cache
  • Закрытые/приватные методы и переменные класса Python
  • Наследование классов
  • Множественное наследование классов
  • Абстрактные классы
  • Перегрузка методов в классе Python
  • Что такое миксины и как их использовать
  • Класс Python как структура данных, подобная языку C
  • Создание пользовательских типов данных
  • Специальные (магические) методы класса Python
  • Базовая настройка классов Python магическими методами
  • Настройка доступа к атрибутам класса Python
  • Дескриптор класса для чайников
  • Протокол дескриптора класса
  • Практический пример дескриптора
  • Использование метода .__new__() в классах Python
  • Специальный атрибут __slots__ класса Python
  • Специальный метод __init_subclass__ класса Python
  • Определение метаклассов metaclass
  • Эмуляция контейнерных типов в классах Python
  • Другие специальные методы класса
  • Как Python ищет специальные методы в классах
  • Шаблон проектирования Фабрика и его реализация

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *