Возвращение класса Python
@Евгений Note(параметры) создает экземпляр класса Note , передав параметры последовательно в методы __new__ и __init__ , сам класс никуда не передается. И незачем так орать.
15 сен 2020 в 17:04
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Возвращать класс нужно в вызывающую функцию,чтобы она воспользовалась методами этого обьекта,ведь возвращается обьект класса,ну а этот обьект по какой то причине был создан в вызываемой функции,например если вы list создаете внутри функции вы можете передать ссылку на него.
Отслеживать
ответ дан 15 сен 2020 в 16:57
Константин Константин
895 4 4 серебряных знака 16 16 бронзовых знаков
Ну вот вам искусственный пример, в котором возвращается и используется класс:
import random class A: def do(): print('Welcome!') class B: def do(): print('Привет!') class C: def random_hello(): if random.randint(0,2) == 0: return A else: return B c = C.random_hello() c.do()
В переменной c получается случайным образом либо класс A , либо класс B , и мы вызываем функцию этого класса, не зная, какой у нас класс, нам всё-равно, у них у обоих есть эта функция.
В вашем же примере возвращается экземпляр класса , это практически тоже самое, что в моём примере, но у вас получается как бы настроенный класс. Т.е. класс то вы возвращаете один и тот же, но поведение у него может быть разное в зависимости от инициализации класса. Опять же пример:
import random class A: def __init__(self, word): self.welcome = word def do(self): print(self.welcome) class B: def make_hello(word): return A(word) c = B.make_hello('Привет!') d = B.make_hello('Welcome!') c.do() d.do()
Привет! Welcome!
Python-сообщество
![]()
- Начало
- » Django
- » Как вернуть один объект а не кверисет ?
#1 Фев. 16, 2010 14:50:09
alexrussia От: Зарегистрирован: 2009-06-16 Сообщения: 27 Репутация: 0 Профиль Отправить e-mail
Как вернуть один объект а не кверисет ?
Здравствуйте.
У меня такой вопрос :
Как вернуть один объект класса Newclass а не целый кверисет?
то есть в шаблон должен выводится один объект из класса Newclass соотвествующий урл ( или более точно объект должен соответствовать self.link возвращаемой get_absolute_url)
Отредактировано (Фев. 16, 2010 14:55:15)
#2 Фев. 16, 2010 14:57:53
regall От: Киев Зарегистрирован: 2008-07-17 Сообщения: 1583 Репутация: 3 Профиль Отправить e-mail
Как вернуть один объект а не кверисет ?
1. Такая конструкция возвращает отдельный объект, а не queryset в отличии от фильтра:
Model.objects.get()
Если по <условие>выбрано больше одного объекта или объектов не найдено — вывалятся соответствующие исключения.
условие>
Отредактировано (Фев. 16, 2010 14:58:05)
#3 Фев. 16, 2010 15:30:43
alexrussia От: Зарегистрирован: 2009-06-16 Сообщения: 27 Репутация: 0 Профиль Отправить e-mail
Как вернуть один объект а не кверисет ?
regall
1. Такая конструкция возвращает отдельный объект, а не queryset в отличии от фильтра:
Код:
Если по выбрано больше одного объекта или объектов не найдено — вывалятся соответствующие исключения.
2. Насчет URL, если я правильно понял вас, то помочь должен декоратор @permalink:
http://docs.djangoproject.com/en/1.1/re … -decorator
Отредактированно regall (Сегодня 15:58:05)
не точно поняли мне нужно:
в классе Newclass есть функция:
@models.permalink
def get_absolute_url(self):
return ('newpage',(),)
возращает self.link
тоесть получается урл www.сайт.ru/link/
Мне нужно чтоб для этого урл в шаблон выводилось одно значение name, одно link , одно text (объявленные в классе Newclass)
я понимаю что с помощью Model.objects.get можно получить объект, в данном случае именно для меня условие труднным является:
Предполагая что должно быть Newclass.objects.get(link= ) а вот как правильно записать, то есть присвоить значение возращаемое get_absolute_url не знаю 🙁
Отредактировано (Фев. 16, 2010 15:33:50)
Объект класса и конструктор класса в 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 ищет специальные методы в классах
- Шаблон проектирования Фабрика и его реализация
Как вернуть значения класса из функции python?
def filePerson():
a = str(input(‘Введите статус, имя, фамилию, и дату рождения(__.__.____) через пробел: ‘))
b = a.split()
status = b[0]
name = b[1]
surname = b[2]
birthday = b[3]
per1 = personOfFamily(status, name, surname, birthday)
print(per1.name, per1.surname, ‘зарегистрирован.’)
return per1
- Вопрос задан более года назад
- 209 просмотров
1 комментарий
Простой 1 комментарий