如何在Python类中"命名空间"方法

ste*_*esu 1 python namespaces class

我想要一个Python类,其中包含如下界面:

import myclass

client = myclass.Client("user", "password")

client.users.create("user1")
client.posts.create("user1", "Hello, World!")
Run Code Online (Sandbox Code Playgroud)

请注意,而不是只是create_usercreate_post,我想使用两个点指定方法:users.create/posts.create

我希望这个特定的接口模仿我正在尝试使用的HTTP API(其端点如"/ api/users/create"和"/ api/posts/create")

如果我在下面定义我的类myclass.py:

class Client(object):
    def __init__(self, user, pass):
        self.user = user
        self.pass = pass
Run Code Online (Sandbox Code Playgroud)

那我该如何创建这些点名称空间的方法呢?我的第一个想法是创建类似的子类:

class Client(object):
    def __init__(self, user, pass):
        self.user = user
        self.pass = pass
        self.users = ClientUserAPI()
        self.posts = ClientPostAPI()

class ClientUserAPI(object):
    def create(self):
        # Do some cURL magic

class ClientPostAPI(object):
    def create(self):
        # Do some cURL magic
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,那么我遇到两个问题之一(一个严重,另一个只是哲学/意识形态)

  1. 如果ClientUserAPI扩展"Client",则该__init__方法创建一个无限循环
  2. 如果ClientUserAPI扩展"对象",那么它将不会直接访问self.userself.pass变量.这意味着我必须__init__在两个辅助类上创建方法,除了assign self.user和之外什么都不做self.pass.这不仅在代码中是冗余的,而且在内存中也是多余的

有更好的解决方案吗?

int*_*ser 5

class Client:
  def __init__(self):
    self.users = ClientUserAPI(self)
    self.posts = ClientPostAPI(self)

class ClientUserAPI:
  def __init__(self, client):
    self.client = client

class ClientPostAPI:
  def __init__(self, client):
    self.client = client
Run Code Online (Sandbox Code Playgroud)