在没有编写继承的情况下,在Python类构造函数中指定参数的默认值的任何简单方法?

时间:2016-12-20 06:00:52

标签: python

有没有什么容易得到一个基于旧类的新类,只是设置了旧类的一些默认参数值?像这样的代码:

class DB():
    def __init__(self, ip, port, dbname, table):
        self.ip = ip
        self.port = port
        self.dbname = dbname
        self.table = table

    def process(self):
        print self.ip, self.port, self.dbname, self.table

现在我需要获取一组默认值为OldClass.aOldClass.bOldClass.c的新类,我将在下面进行操作:

class UserDB(DB):
    def __init__(self, dbname, table):
        OldClass.__init__(self, ip='user.db.com', port='1234', dbname=dbname, table=table)

class ProdDB(DB):
    def __init__(self, dbname, table):
        OldClass.__init__(self, ip='prod.db.com', port='1314', dbname=dbname, table=table)

class CommentDB(DB):
    def __init__(self, dbname, table):
        OldClass.__init__(self, ip='comment.db.com', port='1024', dbname=dbname, table=table)

class MeetingDB(DB):
    def __init__(self, dbname, table):
        OldClass.__init__(self, ip='meeting.db.com', port='8888', dbname=dbname, table=table)

userDB = UserDB('user', 'new')
userDB.process()
prodDB = ProdDB('prod', 'lala')
prodDB.process()
commentDB = UserDB('comm', 'gg')
commentDB.process()
meetingDB = MeetingDB('met', 'ok')
meetingDB.process()

我记得有一些技巧可以简化这些子类冗长代码。欢迎任何建议。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您无需致电家长班级' __init__因为您只想将值设置为实例属性。你可以这样做:

class DB():
    def __init__(self, dbname, table):
        self.dbname = dbname
        self.table = table
        self.ip = 'user.db.com'
        self.port = '1234'

我认为它更干净。实际上,您不需要4个子类。您可以在单个类中使用参数来区分每个数据库的类别:

class DB():

    # Database type configuration
    db_type_conf = {
        'user': {
            'ip': 'xx.xx.xx',
            'port': 'xxxx',
        },
        'comment': {
            'ip': 'xx.xx.xx',
            'port': 'xxxx',
        },
        'prod': {
            'ip': 'xx.xx.xx',
            'port': 'xxxx',
        },
        'meeting': {
            'ip': 'xx.xx.xx',
            'port': 'xxxx',
        }
    }

    def __init__(self, db_type, dbname, table):
        self.dbname = dbname
        self.table = table
        self.port, self.ip = self._get_port_and_ip_from_db_type(db_type)
        #                    return port and ip based on `db_type` ^

    @staticmethod
    def _get_port_and_ip_from_db_type(db_type):
       db_type_conf = self.__class__.db_type_conf[db_type]
       return db_type_conf['port'], db_type_conf['ip']

    def process(self):
        print self.ip, self.port, self.dbname, self.table

要创建对象,您可以执行以下操作:

user_db = DB('user', 'user', 'new')
user_db.process()

答案 1 :(得分:0)

继承是一件很棒的事情:

class DB():
    def __init__(self, ip, port, dbname, table):
        self.ip = ip
        self.port = port
        self.dbname = dbname
        self.table = table

    def process(self):
        print self.ip, self.port, self.dbname, self.table


class UserDB(DB):
    def child_func(self):
        print "We Dont share Email Ids :)"

a = UserDB("151.101.1.69", 1999, "UsersInfo", "user_log")
a.process()
a.child_func()


b = UserDB("151.101.1.69", 2001, "ClickInfo", "click_log")
b.process()
b.child_func()

答案 2 :(得分:0)

您可以使用其他级别的间接解决任何问题。;) 如何在MyDB之间建立另一个班级?:

from __future__ import print_function  # for legacy Python


class DB():
    def __init__(self, ip, port, dbname, table):
        self.ip = ip
        self.port = port
        self.dbname = dbname
        self.table = table

    def process(self):
        print(self.ip, self.port, self.dbname, self.table)

添加覆盖__init__()

的课程
class MyDB(DB):
    def __init__(self, dbname, table):
        super(MyDB, self).__init__(self.ip, self.port, dbname, table)

现在使用类属性。这些类不再需要__init__() ::

class UserDB(MyDB):
    ip = 'user.db.com'
    port = '1234'

class ProdDB(MyDB):
    ip = 'prod.db.com'
    port = '1314'

制作两个测试实例:

user_db = UserDB('user', 'new')
user_db.process()

prod_db = ProdDB('prod', 'lala')
prod_db.process()

输出:

user.db.com 1234 user new
prod.db.com 1314 prod lala

这提供了一种相当陈述的做事方式。 它应该具有可读性,特别是如果类UserDBProdDB没有方法。

由于实例self.ip中不存在self.port,self,搜索将继续执行当前类的类属性,即如果我们使用UserDB UserDB