我经常发现我的类实例是其他类实例的后代,就像时尚树一样.例如,假设我正在使用Python制作CMS平台.我可能有一个领域,在那个博客下,并在那个帖子下.每个构造函数都将它的父元素作为第一个参数,因此它知道它属于什么.它可能看起来像这样:
class Realm(object):
def __init__(self, username, password)
class Blog(object):
def __init__(self, realm, name)
class Post(object);
def __init__(self, blog, title, body)
Run Code Online (Sandbox Code Playgroud)
我通常会向父类添加一个create方法,因此链接更加自动化.My Realm类可能如下所示:
class Realm(object):
def __init__(self, username, password):
...
def createBlog(self, name):
return Blog(self, name)
Run Code Online (Sandbox Code Playgroud)
这允许API的用户不导入每个模块,只导入顶级模块.它可能像:
realm = Realm("admin", "FDS$#%")
blog = realm.createBlog("Kittens!")
post = blog.createPost("Cute kitten", "Some HTML blah blah")
Run Code Online (Sandbox Code Playgroud)
问题是那些创建方法是多余的,我必须在两个地方pydoc相同的参数.
我想知道是否有一个模式(可能使用元类)将一个类实例链接到父类实例.有些方法我可以调用这样的代码并让博客知道它的父域是什么:
realm = Realm("admin", "FDS$#%")
blog = realm.Blog("Kittens!")
Run Code Online (Sandbox Code Playgroud) 我在我的网站上添加了"使用Google登录"联合登录按钮.对于桌面我使用的弹出窗口效果很好:
gapi.auth2.init();
gapi.auth2.getAuthInstance().signIn().then(function(user) {
var id_token = user.getAuthResponse().id_token;
// ajax call to pass this to server
});
Run Code Online (Sandbox Code Playgroud)
但是在移动设备上我们想要使用重定向而不是弹出窗口,因为在移动浏览器中单独的选项卡有点笨拙.我只是改为:
gapi.auth2.init({
ux_mode: 'redirect',
redirect_uri: 'http://example.com/google_login/'
});
Run Code Online (Sandbox Code Playgroud)
这有效,但它添加了我需要的id_token作为哈希片段,服务器无法看到.它最终在:
http://example.com/google_login/#id_token=ASDFASDFASDFASDF
Run Code Online (Sandbox Code Playgroud)
我想我可以渲染一个带有脚本标签的连接器页面拉出window.location.hash并将其作为查询参数重定向到自身,但看起来很疯狂我必须这样做.有没有更好的办法?
我已经写在扭曲的一个简单的web服务器,我试图用其启动守护进程的twistd来.一切正常,reactor.run()但是当我使用twistd -y(作为root)时,找不到直接子目录中的任何包.我正在以root身份运行,因为服务器在端口80上运行.wordd的联机帮助页说:
请注意,如果twistd以root身份运行,则不会在工作目录中搜索Python模块.
那很好但为什么呢?我该如何解决?--rundir .即使我明确地设置了这个选项,twistd似乎也在忽略.
我认为\b匹配在单词和非单词字符之间的过渡处,或者在字符串的开头或结尾处。所以这应该是真的:
'#abc'.match(/\b#/)
Run Code Online (Sandbox Code Playgroud)
但它是 null,至少在 Firefox 和 Chrome 中是这样。知道为什么吗?