相关疑难解决方法(0)

Python中的类工厂

我是Python的新手,需要一些建议来实现下面的场景.

我在两个不同的注册商处有两个用于管理域名的课程.两者都具有相同的界面,例如

class RegistrarA(Object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...
Run Code Online (Sandbox Code Playgroud)

class RegistrarB(object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...
Run Code Online (Sandbox Code Playgroud)

我想创建一个Domain类,给定一个域名,根据扩展名加载正确的注册器类,例如

com = Domain('test.com') #load RegistrarA
com.lookup()

biz = Domain('test.biz') #load RegistrarB
biz.lookup()
Run Code Online (Sandbox Code Playgroud)

我知道这可以使用工厂函数来完成(见下文),但这是最好的方法吗?还是有更好的方法使用OOP功能?

def factory(domain):
  if ...:
    return RegistrarA(domain)
  else:
    return RegistrarB(domain)
Run Code Online (Sandbox Code Playgroud)

python factory

64
推荐指数
4
解决办法
7万
查看次数

使函数的有效方式仅在循环中执行一次

目前,我正在做类似以下的事情,这很乏味:

run_once = 0
while 1:
    if run_once == 0:
        myFunction()
        run_once = 1:
Run Code Online (Sandbox Code Playgroud)

我猜有一些更可接受的方式来处理这些东西?

我正在寻找的是按需执行一次函数.例如,按下某个按钮.它是一个交互式应用程序,具有许多用户控制的开关.每个交换机都有一个垃圾变量,只是为了跟踪它是否已经运行,似乎效率低下.

python

62
推荐指数
6
解决办法
8万
查看次数

虚拟课程:做得对吗?

我一直在阅读描述类继承,抽象基类甚至python接口的文档.但没有什么能成为我想要的东西.即,构建虚拟类的简单方法.当调用虚拟类时,我希望它根据给出的参数实例化一些更具体的类,并将其交给调用函数.现在我有一种将虚拟类的调用重新路由到底层类的简要方法.

这个想法如下:

class Shape:
    def __init__(self, description):
        if   description == "It's flat":  self.underlying_class = Line(description)
        elif description == "It's spiky": self.underlying_class = Triangle(description)
        elif description == "It's big":   self.underlying_class = Rectangle(description)
    def number_of_edges(self, parameters):
        return self.underlying_class(parameters)

class Line:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 1

class Triangle:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 3

class Rectangle:
    def __init__(self, description):
        self.desc = description
    def number_of_edges(self, parameters):
        return 4

shape_dont_know_what_it_is = Shape("It's big")
shape_dont_know_what_it_is.number_of_edges(parameters) …
Run Code Online (Sandbox Code Playgroud)

python virtual inheritance class abstract

11
推荐指数
2
解决办法
8802
查看次数

不正确地使用__new__来生成类?

我正在创建一些类来处理各种类型的文件共享(nfs,afp,s3,本地磁盘)等文件名.我得到一个用户输入一个标识数据源(即"nfs://192.168.1.3""s3://mybucket/data")等的字符串.

我从具有公共代码的基类继承特定文件系统.我困惑的地方是对象创建.我所拥有的是以下内容:

import os

class FileSystem(object):
    class NoAccess(Exception):
        pass

    def __new__(cls,path):
        if cls is FileSystem:
            if path.upper().startswith('NFS://'): 
                return super(FileSystem,cls).__new__(Nfs)
            else: 
                return super(FileSystem,cls).__new__(LocalDrive)
        else:
            return super(FileSystem,cls).__new__(cls,path)

    def count_files(self):
        raise NotImplementedError

class Nfs(FileSystem):
    def __init__ (self,path):
        pass

    def count_files(self):
        pass

class LocalDrive(FileSystem):
    def __init__(self,path):
        if not os.access(path, os.R_OK):
            raise FileSystem.NoAccess('Cannot read directory')
        self.path = path

    def count_files(self):
        return len([x for x in os.listdir(self.path) if os.path.isfile(os.path.join(self.path, x))])

data1 = FileSystem('nfs://192.168.1.18')
data2 = FileSystem('/var/log')

print type(data1)
print type(data2)

print data2.count_files() …
Run Code Online (Sandbox Code Playgroud)

python factory factory-pattern

9
推荐指数
2
解决办法
3228
查看次数

元类参数化继承

我已经阅读了一些关于Python元类的教程.我之前从未使用过一个,但我需要一个相对简单的东西,所有的教程似乎都面向更复杂的用例.我基本上想要创建一个具有一些预先指定的主体的模板类,但是将其基类作为参数.因为我从C++/D模板中得到了这个想法,这里是我想要编写的代码在C++中的样子:

template<class T>
    class Foo : T {
        void fun() {}
    }
Run Code Online (Sandbox Code Playgroud)

c++ python templates metaprogramming metaclass

6
推荐指数
1
解决办法
1266
查看次数