Skip to main content
 首页 » 编程设计

python之如何在 Python 类中使用 "namespace"方法

2025年05月04日22zhujiabin

我想要一个具有如下接口(interface)的 Python 类:

import myclass 
 
client = myclass.Client("user", "password") 
 
client.users.create("user1") 
client.posts.create("user1", "Hello, World!") 

请注意,我想使用两个点来指定方法,而不仅仅是 create_user 或 create_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 

那么如何创建这些点命名空间的方法呢?我的第一个想法是像这样创建子类:

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 

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

  1. 如果 ClientUserAPI 扩展“Client”,则 __init__ 方法会创建一个无限循环
  2. 如果 ClientUserAPI 扩展了“object”,那么它将无法直接访问 self.user 和 self.pass 变量。这意味着我必须在两个助手类上创建 __init__ 方法,它们除了分配 self.user 和 self.pass 外什么都不做。这不仅在代码上是多余的,而且在内存上也是多余的

有没有更好的解决方案?

请您参考如下方法:

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