J'ai une classe User avec un certain nombre de propriétés. Je veux passer "certaines" des mêmes propriétés sur l'objet client et leur permettre d'être accessibles comme suit:

User(x=1)
User.x
User.y
User.client.x

C'est ce que j'ai essayé, mais je ne peux pas le faire fonctionner. TypeError: __init __ () prend 1 argument positionnel mais 2 ont été donnés.

class User(object):

    def __init__(self, x, y etc...):

        self.x = x
        self.y = y
        # objects

        self.client = Client(self)

    @property
    def z(self):
        return "test"

class Client(object):

    def __init__(self, **kwargs):

        self.x = kwargs.get('x')
0
MrKnotts 17 avril 2018 à 00:28

4 réponses

Meilleure réponse

Le constructeur de client prend 0 arguments positionnels. Vous devez ajouter un argument positionnel pour l'instance de la classe User. Et vous n'avez pas vraiment besoin du **kwargs.

class Client(object):

    def __init__(self, parent):

        self.x = parent.x
1
fferri 16 avril 2018 à 21:33

De plus, si vous souhaitez accéder à n'importe quel attribut d'utilisateur à partir du client, vous pouvez l'utiliser. Mais je dois dire, je ne sais pas comment cela peut vous être utile:

class User:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.client = Client(self)


class Client:
    def __init__(self, user):
        self.user = user
        self.z = 10
    def __getattr__(self, item):
        __no_attr_marker = object()  # allow a None in a User attribute
        user_item = getattr(self.user, item, __no_attr_marker)
        if user_item is not __no_attr_marker:
            return user_item
        else:
            return self.__getattribute__(item)

Essai:

user = User(1, None)
print(user.x)
print(user.y)
print(user.client.x)
print(user.client.z)
print(user.client.client)

1
None
1
10
<__main__.Client object at 0x7f4e904bf8d0>
1
TwistedSim 16 avril 2018 à 21:49

Votre test utilise l'utilisateur de manière incorrecte. vous devez conserver le retour d'objet par la classe User:

user = User(1, 2)
print(user.x)
print(user.y)
print(user.client.x)
0
TwistedSim 16 avril 2018 à 21:36

C'est aussi un moyen

class User(object):

    def __init__(self, x):
        self.x = x
        self.client = Client(self)


class Client(object):

    def __init__(self, user):
        self.user = user

    @property
    def x(self):
        return self.user.x


u = User(1)
print u.x
u.x = 3
print u.client.x

Production

1
3
1
shahaf 16 avril 2018 à 21:43