Czy to zachowanie jest możliwe w Pythonie?

class A():
    def __init__(self, string):
        self.string = string
    def __???__(self):
        return self.string

a = A("world")
hw = "hello "+a
print(hw)
>>> hello world

Zdaję sobie sprawę, że mogę zrobić str (a), ale zastanawiam się, czy można było użyć "A", jakby był obiektem strunowym.

1
Frank Vel 26 czerwiec 2017, 22:37

3 odpowiedzi

Najlepsza odpowiedź

To działa dla mnie:

class A(str):

    def __init__(self, string):
        super().__init__()

a = A('world')
hw = 'hello ' + a
print(hw)

Wynik:

hello world

Testowanie z funkcją niestandardową dodaną:

class A(str):

     def __init__(self, string):
        self.string = string
        super().__init__()

    def custom_func(self, multiple):

        self = self.string * multiple
        return self

a = A('world')
hw = 'hello ' + a
print(hw)

new_a = a.custom_func(3)
print(new_a)

Wynik:

hello world
worldworldworld

Albo jeśli nie musisz nic robić na inicjowaniu klasy:

class A(str):
    pass

    def custom_func(self, multiple):
        self = self * multiple
        return self
2
jack6e 26 czerwiec 2017, 20:01

Zrobić :

class A:
    def __init__(self, string):
        self.string = string

    # __add__: instance + noninstance
    #          instance + instance
    def __add__(self, string):
        print('__add__')
        return self.string + string

    # __radd__: noninstance + instance
    def __radd__(self, string):
        print('__radd__')
        return string + self.string


a = A("world")
hw = "hello " + a
print(1, hw)

hw = a + " hello"
print(2, hw)

hw = a + a
print(3, hw)

Wynik:

__radd__
(1, 'hello world')
__add__
(2, 'world hello')
__add__
__radd__
(3, 'worldworld')
1
glegoux 26 czerwiec 2017, 19:50

Co powiesz na coś takiego? Używanie UserString z collections.

from collections import UserString

class MyString(UserString):
  pass

test = MyString('test')
print(test)
print(test + 'test')

https://repl.it/jclw/0.

2
koralarts 26 czerwiec 2017, 19:45