← Назад к вопросам

Что выведет print(some.attr), где some — это объект?

2.0 Middle🔥 111 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что выводит print(some.attr) при обращении к атрибуту объекта

Это вопрос о том, что Python выводит при попытке напечатать атрибут объекта. Ответ зависит от типа атрибута и определения методов __str__ или __repr__.

Пример 1: Простой атрибут (переменная)

class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

person = Person("Alice", 30)
print(person.name)    # "Alice" — выводится значение строки
print(person.age)     # 30 — выводится число

В этом случае print() просто выводит значение атрибута, приведённое к строке.

Пример 2: Метод класса (без вызова)

class Calculator:
    def add(self, a, b):
        return a + b

calc = Calculator()
print(calc.add)  # <bound method Calculator.add at 0x...>

Если вы пытаетесь напечатать метод без скобок, Python выведет представление метода (bound method object). Это адрес объекта в памяти.

Пример 3: Функция как атрибут

def greet(name: str):
    return f"Hello, {name}"

class Greeter:
    say_hello = greet  # Функция как атрибут класса

g = Greeter()
print(g.say_hello)  # <function greet at 0x...>
print(g.say_hello("Bob"))  # "Hello, Bob" — вызов функции

Пример 4: Свойство (property)

class Temperature:
    def __init__(self, celsius: float):
        self._celsius = celsius
    
    @property
    def fahrenheit(self) -> float:
        return self._celsius * 9/5 + 32

temp = Temperature(0)
print(temp.fahrenheit)  # 32.0 — property автоматически вызывается

При обращении к property, Python автоматически вызывает метод getter и выводит результат.

Пример 5: Объект другого класса (использование str/repr)

class Car:
    def __init__(self, model: str):
        self.model = model
    
    def __str__(self) -> str:
        return f"Car: {self.model}"
    
    def __repr__(self) -> str:
        return f"Car({self.model})"

class Garage:
    def __init__(self):
        self.car = Car("Toyota")

garage = Garage()
print(garage.car)  # "Car: Toyota" — используется __str__

Когда атрибут — это объект другого класса, print() вызывает его __str__() метод для красивого вывода.

Пример 6: Если str не определён

class Dog:
    pass  # Нет __str__ и __repr__

dog = Dog()
print(dog)  # <__main__.Dog object at 0x7f8b8c0a2d90>

Без __str__, Python выводит стандартное представление — класс и адрес в памяти.

Пример 7: None и значения по умолчанию

class User:
    def __init__(self, name: str):
        self.name = name
        self.email = None  # Атрибут не инициализирован

user = User("John")
print(user.email)  # None — выводится None

Пример 8: Атрибут, который не существует (AttributeError)

class Person:
    def __init__(self, name: str):
        self.name = name

person = Person("Alice")
print(person.age)  # AttributeError: Person object has no attribute age

Если атрибут не существует, Python выбросит исключение.

Пример 9: Дескриптор (Descriptor)

class Descriptor:
    def __get__(self, obj, objtype=None):
        return "Значение из дескриптора"

class MyClass:
    attr = Descriptor()

obj = MyClass()
print(obj.attr)  # "Значение из дескриптора" — вызывается __get__

Пример 10: Список или словарь как атрибут

class Data:
    def __init__(self):
        self.items = [1, 2, 3]
        self.config = {"key": "value"}

data = Data()
print(data.items)   # [1, 2, 3]
print(data.config)  # {key: value}

Полный пример с разными атрибутами

class CompleteExample:
    def __init__(self):
        self.name = "Alice"           # Строка
        self.age = 30                 # Число
        self.hobbies = ["reading"]    # Список
        self.data = None              # None
    
    def method(self):
        return "Это метод"
    
    @property
    def info(self) -> str:
        return f"{self.name}, {self.age} лет"
    
    def __str__(self) -> str:
        return f"CompleteExample({self.name})"

obj = CompleteExample()

print(obj.name)      # "Alice"
print(obj.age)       # 30
print(obj.hobbies)   # [reading]
print(obj.data)      # None
print(obj.method)    # <bound method CompleteExample.method at 0x...>
print(obj.method())  # "Это метод"
print(obj.info)      # "Alice, 30 лет" (property вызывается автоматически)
print(obj)           # "CompleteExample(Alice)" (вызывается __str__)

Как Python выбирает, что выводить

  1. Если это простой тип (str, int, list, dict и т.д.) → выводит значение
  2. Если это объект с __str__ → вызывает __str__() и выводит результат
  3. Если это объект без __str__ → выводит <ClassName object at 0x...>
  4. Если это метод/функция → выводит <bound method ...at 0x...> или <function ...at 0x...>
  5. Если это property → вызывает getter и выводит результат
  6. Если это дескриптор → вызывает __get__() и выводит результат
  7. Если атрибут не существует → вызывает AttributeError

Практический совет

Для удобной отладки всегда определяйте __str__ и __repr__ в ваших классах:

class Product:
    def __init__(self, name: str, price: float):
        self.name = name
        self.price = price
    
    def __str__(self) -> str:
        """Для print() — читаемое представление"""
        return f"{self.name}: ${self.price:.2f}"
    
    def __repr__(self) -> str:
        """Для отладки — точное представление"""
        return f"Product({self.name}, {self.price})"

product = Product("Laptop", 999.99)
print(product)        # "Laptop: $999.99" (используется __str__)
print(repr(product))  # "Product(Laptop, 999.99)" (используется __repr__)

Вывод: print(some.attr) выводит разные значения в зависимости от того, что находится в attr и какие методы определены в его классе.

Что выведет print(some.attr), где some — это объект? | PrepBro