有没有什么容易得到一个基于旧类的新类,只是设置了旧类的一些默认参数值?像这样的代码:
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.a
,OldClass.b
,OldClass.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()
我记得有一些技巧可以简化这些子类冗长代码。欢迎任何建议。提前谢谢。
答案 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
这提供了一种相当陈述的做事方式。
它应该具有可读性,特别是如果类UserDB
和ProdDB
没有方法。
由于实例self.ip
中不存在self.port,
和self
,搜索将继续执行当前类的类属性,即如果我们使用UserDB
UserDB
。