Zwracanie obiektu przez instancję klasy

0

Witam, Mamy prostą klasę "liczba"

class liczba:
    def __init__(self):
        self.value = 50
    def __int__(self):
        retutn self.value

Jeżeli stworzymy obiekt tej klasy

ob = liczba()

to po komendzie

print(int(ob))

otrzymamy wartość 50.

Co powinienem zmodyfikować aby otrzymać ten sam wynik, ale po wpisaniu komendy

print(ob) #bez int()

Faktyczny problem jest nico bardziej skomplikowany lecz analogiczny.

0

Hej,
chyba tak wystarczy:

ob.__int__()

Pzdr... :)

0
class liczba:
    def __init__(self):
        self.value = 50
    def __str__(self):
        return str(self.value)
0

stivens to faktycznie wypisze 50 ale liczba to nie będzie. Wyświetlony zostanie string. Szukam czegoś co po wywołaniu obiektu zwróci dowolny typ danych.

def dodajnik(self,liczba):
    return liczba+=5
ob = liczba()  # klasa z pierwszego posta
dodajnik(ob)

Powyższy skrypt powinien zwrócić 55

0

Hej,
nie do końca rozumiem ideę pomysłu... w jakim celu chcesz stworzyć objekt, aby zwracać liczbę ?? od tego są metody... wyjaśnij może z czym masz problem, i looknij na to:

class liczba:
    def __init__(self):
        self.value = 50
    def __int__(self):
        return self.value
    def dodajnik(self,liczba):
        return self.value+5

ob = liczba()
print(ob.__int__())
print(ob.dodajnik(5))

Pzdr... :)

2
ziajek444 napisał(a):

stivens to faktycznie wypisze 50 ale liczba to nie będzie. Wyświetlony zostanie string. Szukam czegoś co po wywołaniu obiektu zwróci dowolny typ danych.

def dodajnik(self,liczba):
    return liczba+=5
ob = liczba()  # klasa z pierwszego posta
dodajnik(ob)

Powyższy skrypt powinien zwrócić 55

To chyba potrzebujesz dodatkowo coś w rodzaju:

# kod klasy blah blah blah
def __add__(self, val: int):
  return self.value + val

Potem możesz zrobić:

myval = MyVal(100) # ten cały nasz obiekcik z metodą __add__
print(myval + 5) # powinno printnąć 105

Nie testowałem pod kątem głupich błędów, ale rozumiesz ideę? ;)
EDIT Działający przykład:

>>> class Value:
...   def __init__(self, val: int):
...     self._value = val
...   def __int__(self):
...     return int(self._value)
...   def __add__(self, val: int):
...     return self._value + val
...
>>> v = Value(10)
>>> print(v + 5)
15
>>>
0
ziajek444 napisał(a):

stivens to faktycznie wypisze 50 ale liczba to nie będzie. Wyświetlony zostanie string. Szukam czegoś co po wywołaniu obiektu zwróci dowolny typ danych.

def dodajnik(self,liczba):
    return liczba+=5
ob = liczba()  # klasa z pierwszego posta
dodajnik(ob)

Powyższy skrypt powinien zwrócić 55

Nadpisz w klasie call i będziesz mógł nadpisać wywoływanie obiektów - i potraktować swój obiekt jako funkcję

np:

class liczba:
    def __init__(self, value):
        self.value = value

    def __int__(self):
        return self.value

    def __str__(self):
      return str(self.value)

    def __call__(self):
      return liczba(self.value + 5)


a = liczba(50)
b = a()
print(a)
print(b)
print(b())
0

Dobra szanowni, odpowiedzi padają dobre pod kątem uproszczonego problemu. W takim razie zaprezentuje właściwy problem bo zdaje się że chcąc ułatwić, trudniłem współpracę.

import pygame
pygame.init()

class Figura:
    def __init__(self):
        selfi.prostokat = pygame.Surface((100, 200))  # tworzy pustą płaszczyznę o wymiarach 100x200
        selfi.prostokat.fill((255, 0, 0))  # wypełnia płaszczyznę kolorem (czerwonym)
    def GetButton(self):
        return selfi.prostokat # Zwraca nasz prostokąt 100x200 w kolorze czerwonym

ekran = pygame.display.set_mode((800,600))  # tworzy puste okno 800x600

# ekran ma metodę blit(pygame.Surface,(pozycja))
# chciałbym zrobi tak
Fig1 = Figura()
ekran.blit(Fig1,(100,100))
# zamiast tak
Fig2 = Figura()
ekran.blit(Fig2.GetButton(),(300,400))  # Fig2.GetButton() zwraca nasz prostokąt który jest typu pygame.Surface

ekran.display.flip()  # wyświetla ekran i jego zawartość

Czyli ostatecznie chciałbym żeby obiekt klasy Figura wywołany zwracał wewnętrzny obiekt pygame.Surface

0

Ale to tak nie dziala...
mozesz uzyc dziedziczenia i zrobic wlasny obiekt dziedziczacy po pygame.Surface

0

No szkoda,

2

A co Ci przeszkadza pisać Fig1.getButton()?

1
import pygame
pygame.init()
 
class Figura(pygame.Surface):
    def __init__(self):
        super().__init__((100, 200))  # tworzy pustą płaszczyznę o wymiarach 100x200
        self.fill((255, 0, 0))  # wypełnia płaszczyznę kolorem (czerwonym)

ekran = pygame.display.set_mode((800,600))  # tworzy puste okno 800x600
 
Fig1 = Figura()
ekran.blit(Fig1,(100,100))

pygame.display.flip()  # wyświetla ekran i jego zawartość

0

stivens działa bardzo ładnie, dziekuję

1

Można by było to jeszcze tak napisać ale lepiej prawidłowo dziedziczyć...

class Figura:
    def __new__(cls, *args, **kwargs):
        instance = super(Figura, cls).__new__(cls)
        instance.__init__(*args, **kwargs)
        return instance.value

    def __init__(self, value):
        self.value = value
        
fig = Figura(50)

print(fig)

1 użytkowników online, w tym zalogowanych: 0, gości: 1