在Python中如何从一个类传递和设置相同的属性

时间:2018-04-16 21:28:25

标签: python python-3.x

我有一个包含许多属性的类User。我想通过一些'在client对象上具有相同属性,并允许按以下方式访问它们:

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

这是我尝试过的,但无法让它发挥作用。 TypeError:__ init __()采用1个位置参数,但给出了2个。

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')

4 个答案:

答案 0 :(得分:1)

客户端的构造函数采用0位置参数。您应该为User类的实例添加一个位置参数。而且你真的不需要**kwargs

class Client(object):

    def __init__(self, parent):

        self.x = parent.x

答案 1 :(得分:1)

此外,如果要从客户端访问用户的任何属性,可以使用此属性。但是我会说,我不知道这对你有什么用处:

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)

测试:

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>

答案 2 :(得分:1)

这也是一种方式

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

输出

1
3

答案 3 :(得分:0)

您的测试以错误的方式使用用户。你需要通过User类保持对象返回:

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