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_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
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)
但是,如果我这样做,那么我遇到两个问题之一(一个严重,另一个只是哲学/意识形态)
ClientUserAPI扩展"Client",则该__init__方法创建一个无限循环ClientUserAPI扩展"对象",那么它将不会直接访问self.user和self.pass变量.这意味着我必须__init__在两个辅助类上创建方法,除了assign 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
Run Code Online (Sandbox Code Playgroud)