как сделать функцию вызываемой, при этом вызывая функцию внутри - PullRequest
0 голосов
/ 26 января 2020

Я делаю игру и хотел создать класс объектов для своих объектов, но также решил немного проявить себя sh, и теперь я столкнулся с дорожным блоком.

Итак, я хочу функцию быть вызываемым при возможности использовать его как каталог. Я не хочу, чтобы функции get / set мешали классам get / set.

Пример:

obj.position.get()
obj.position.get.x()

Код:

class Object:
    def __init__(self, x, y, width, height):
        self.__x = x
        self.__y = y
        self.__width = width
        self.__height = height
        self.size = self.__Size(self)
        self.position = self.__Position(self)

    class __Size:
        def __init__(self, outer):
            self.__outer = outer
            self.get = self.__get(self.__outer)
            self.set = self.__set(self.__outer)

        # Trying to make the two functions below work without interfering with the __get and __set classes

        def get(self):
            return self.__outer.__width, self.__outer.__height

        def set(self, width, height):
            self.__outer.__width = width
            self.__outer.__height = height

        class __get:
            def __init__(self, outer):
                self.__outer = outer

            def width(self):
                return self.__outer.__width

            def height(self):
                return self.__outer.__height

        class __set:
            def __init__(self, outer):
                self.__outer = outer

            def width(self, width):
                self.__outer.__width = width

            def height(self, height):
                self.__outer.__height = height


    class __Position:
        def __init__(self, outer):
            self.__outer = outer
            self.get = self.__get(self.__outer)
            self.set = self.__set(self.__outer)

        # Trying to make the two functions below work without interfering with the __get and __set classes

        def get(self):
            return self.__outer.__x, self.__outer.__y

        def set(self, x, y):
            self.__outer.__x = x
            self.__outer.__y = y

        class __get:
            def __init__(self, outer):
                self.__outer = outer

            def width(self):
                return self.__outer.__x

            def height(self):
                return self.__outer.__y

        class __set:
            def __init__(self, outer):
                self.__outer = outer

            def x(self, x):
                self.__outer.__x = x

            def y(self, y):
                self.__outer.__y = y

1 Ответ

2 голосов
/ 26 января 2020

То, что у вас есть, мучительно сложно. Вам не нужно иметь вложенные классы для использования композиции.

class Size:
    def __init__(self, width, height):
        self.width = width
        self.height = height


class Position:
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Object:
    def __init__(self, size, pos):
        self.size = size
        self.pos = pos

    @classmethod
    def from_scratch(cls, x, y, width, height):
        return cls(Size(x,y), Position(width, height))


obj1 = Object(Size(3, 5), Position(0,0))
obj2 = Object.from_scratch(9, 22, 10, 5)

obj1_location = obj1.position
obj2_size = obj2.size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...