Python: How to subclass while calling parent class?
I have the following class which is being subclassed:
class ConnectionManager(object):
def __init__(self, type=None):
self.type = None
self.host = None
self.username = None
self.password = None
self.database = None
self.port = None
def _setup_connection(self, type):
pass
I then have a specific manager for various database. And I can call those like this:
c = MySQLConnectionManager()
c._setup_connection(...)
However, is there a way to do the following instead?
c = ConnectionManager("MySQL")
c._setup_connection(x,y,z) # this would call the MySQLConnectionManager,
# not the ConnectionManager
Basically, I want to be able to call things in reverse order, is that possible?
python python-3.x subclassing
add a comment |
I have the following class which is being subclassed:
class ConnectionManager(object):
def __init__(self, type=None):
self.type = None
self.host = None
self.username = None
self.password = None
self.database = None
self.port = None
def _setup_connection(self, type):
pass
I then have a specific manager for various database. And I can call those like this:
c = MySQLConnectionManager()
c._setup_connection(...)
However, is there a way to do the following instead?
c = ConnectionManager("MySQL")
c._setup_connection(x,y,z) # this would call the MySQLConnectionManager,
# not the ConnectionManager
Basically, I want to be able to call things in reverse order, is that possible?
python python-3.x subclassing
Perhaps you should be implementing__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed.__init__()
is too late to do any such thing, the object has already been created.
– jasonharper
Nov 19 '18 at 23:17
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper what would I return in the__new__
method? Would it bereturn MySQLConnectionManager()
?
– David L
Nov 19 '18 at 23:32
add a comment |
I have the following class which is being subclassed:
class ConnectionManager(object):
def __init__(self, type=None):
self.type = None
self.host = None
self.username = None
self.password = None
self.database = None
self.port = None
def _setup_connection(self, type):
pass
I then have a specific manager for various database. And I can call those like this:
c = MySQLConnectionManager()
c._setup_connection(...)
However, is there a way to do the following instead?
c = ConnectionManager("MySQL")
c._setup_connection(x,y,z) # this would call the MySQLConnectionManager,
# not the ConnectionManager
Basically, I want to be able to call things in reverse order, is that possible?
python python-3.x subclassing
I have the following class which is being subclassed:
class ConnectionManager(object):
def __init__(self, type=None):
self.type = None
self.host = None
self.username = None
self.password = None
self.database = None
self.port = None
def _setup_connection(self, type):
pass
I then have a specific manager for various database. And I can call those like this:
c = MySQLConnectionManager()
c._setup_connection(...)
However, is there a way to do the following instead?
c = ConnectionManager("MySQL")
c._setup_connection(x,y,z) # this would call the MySQLConnectionManager,
# not the ConnectionManager
Basically, I want to be able to call things in reverse order, is that possible?
python python-3.x subclassing
python python-3.x subclassing
edited Nov 19 '18 at 23:21
oetoni
7811821
7811821
asked Nov 19 '18 at 23:10
David LDavid L
31311
31311
Perhaps you should be implementing__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed.__init__()
is too late to do any such thing, the object has already been created.
– jasonharper
Nov 19 '18 at 23:17
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper what would I return in the__new__
method? Would it bereturn MySQLConnectionManager()
?
– David L
Nov 19 '18 at 23:32
add a comment |
Perhaps you should be implementing__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed.__init__()
is too late to do any such thing, the object has already been created.
– jasonharper
Nov 19 '18 at 23:17
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper what would I return in the__new__
method? Would it bereturn MySQLConnectionManager()
?
– David L
Nov 19 '18 at 23:32
Perhaps you should be implementing
__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed. __init__()
is too late to do any such thing, the object has already been created.– jasonharper
Nov 19 '18 at 23:17
Perhaps you should be implementing
__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed. __init__()
is too late to do any such thing, the object has already been created.– jasonharper
Nov 19 '18 at 23:17
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper what would I return in the
__new__
method? Would it be return MySQLConnectionManager()
?– David L
Nov 19 '18 at 23:32
@jasonharper what would I return in the
__new__
method? Would it be return MySQLConnectionManager()
?– David L
Nov 19 '18 at 23:32
add a comment |
1 Answer
1
active
oldest
votes
One approach would be to use the static factory method pattern. Leaving out non-relevant code for brevity:
class ConnectionManager:
# Create based on class name:
@staticmethod
def factory(type):
if type == "mysql": return MySqlConnectionManager()
if type == "psql": return PostgresConnectionManager()
else:
# you could raise an exception here
print("Invalid subtype!")
class MySqlConnectionManager(ConnectionManager):
def connect(self): print("Connecting to MySQL")
class PostgresConnectionManager(ConnectionManager):
def connect(self): print("Connecting to Postgres")
Use the factory method to create subclass instances:
psql = ConnectionManager.factory("psql")
mysql = ConnectionManager.factory("mysql")
Then use your subclass objects as needed:
psql.connect() # "Connecting to Postgres"
mysql.connect() # "Connecting to MySQL"
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the__new__()
item?
– David L
Nov 19 '18 at 23:53
also, what does the linefactory = staticmethod(factory)
do?
– David L
Nov 19 '18 at 23:59
@HenryH updated to use thestaticmethod
decorator, which allows us to call the decorated methodfactory
from an uninstantiated object.
– Wes Doyle
Nov 20 '18 at 0:16
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (__new__
) - one important distinction is that the static factory method can be meaningfully named.
– Wes Doyle
Nov 20 '18 at 2:11
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383957%2fpython-how-to-subclass-while-calling-parent-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
One approach would be to use the static factory method pattern. Leaving out non-relevant code for brevity:
class ConnectionManager:
# Create based on class name:
@staticmethod
def factory(type):
if type == "mysql": return MySqlConnectionManager()
if type == "psql": return PostgresConnectionManager()
else:
# you could raise an exception here
print("Invalid subtype!")
class MySqlConnectionManager(ConnectionManager):
def connect(self): print("Connecting to MySQL")
class PostgresConnectionManager(ConnectionManager):
def connect(self): print("Connecting to Postgres")
Use the factory method to create subclass instances:
psql = ConnectionManager.factory("psql")
mysql = ConnectionManager.factory("mysql")
Then use your subclass objects as needed:
psql.connect() # "Connecting to Postgres"
mysql.connect() # "Connecting to MySQL"
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the__new__()
item?
– David L
Nov 19 '18 at 23:53
also, what does the linefactory = staticmethod(factory)
do?
– David L
Nov 19 '18 at 23:59
@HenryH updated to use thestaticmethod
decorator, which allows us to call the decorated methodfactory
from an uninstantiated object.
– Wes Doyle
Nov 20 '18 at 0:16
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (__new__
) - one important distinction is that the static factory method can be meaningfully named.
– Wes Doyle
Nov 20 '18 at 2:11
add a comment |
One approach would be to use the static factory method pattern. Leaving out non-relevant code for brevity:
class ConnectionManager:
# Create based on class name:
@staticmethod
def factory(type):
if type == "mysql": return MySqlConnectionManager()
if type == "psql": return PostgresConnectionManager()
else:
# you could raise an exception here
print("Invalid subtype!")
class MySqlConnectionManager(ConnectionManager):
def connect(self): print("Connecting to MySQL")
class PostgresConnectionManager(ConnectionManager):
def connect(self): print("Connecting to Postgres")
Use the factory method to create subclass instances:
psql = ConnectionManager.factory("psql")
mysql = ConnectionManager.factory("mysql")
Then use your subclass objects as needed:
psql.connect() # "Connecting to Postgres"
mysql.connect() # "Connecting to MySQL"
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the__new__()
item?
– David L
Nov 19 '18 at 23:53
also, what does the linefactory = staticmethod(factory)
do?
– David L
Nov 19 '18 at 23:59
@HenryH updated to use thestaticmethod
decorator, which allows us to call the decorated methodfactory
from an uninstantiated object.
– Wes Doyle
Nov 20 '18 at 0:16
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (__new__
) - one important distinction is that the static factory method can be meaningfully named.
– Wes Doyle
Nov 20 '18 at 2:11
add a comment |
One approach would be to use the static factory method pattern. Leaving out non-relevant code for brevity:
class ConnectionManager:
# Create based on class name:
@staticmethod
def factory(type):
if type == "mysql": return MySqlConnectionManager()
if type == "psql": return PostgresConnectionManager()
else:
# you could raise an exception here
print("Invalid subtype!")
class MySqlConnectionManager(ConnectionManager):
def connect(self): print("Connecting to MySQL")
class PostgresConnectionManager(ConnectionManager):
def connect(self): print("Connecting to Postgres")
Use the factory method to create subclass instances:
psql = ConnectionManager.factory("psql")
mysql = ConnectionManager.factory("mysql")
Then use your subclass objects as needed:
psql.connect() # "Connecting to Postgres"
mysql.connect() # "Connecting to MySQL"
One approach would be to use the static factory method pattern. Leaving out non-relevant code for brevity:
class ConnectionManager:
# Create based on class name:
@staticmethod
def factory(type):
if type == "mysql": return MySqlConnectionManager()
if type == "psql": return PostgresConnectionManager()
else:
# you could raise an exception here
print("Invalid subtype!")
class MySqlConnectionManager(ConnectionManager):
def connect(self): print("Connecting to MySQL")
class PostgresConnectionManager(ConnectionManager):
def connect(self): print("Connecting to Postgres")
Use the factory method to create subclass instances:
psql = ConnectionManager.factory("psql")
mysql = ConnectionManager.factory("mysql")
Then use your subclass objects as needed:
psql.connect() # "Connecting to Postgres"
mysql.connect() # "Connecting to MySQL"
edited Nov 20 '18 at 1:57
answered Nov 19 '18 at 23:41
Wes DoyleWes Doyle
1,0792719
1,0792719
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the__new__()
item?
– David L
Nov 19 '18 at 23:53
also, what does the linefactory = staticmethod(factory)
do?
– David L
Nov 19 '18 at 23:59
@HenryH updated to use thestaticmethod
decorator, which allows us to call the decorated methodfactory
from an uninstantiated object.
– Wes Doyle
Nov 20 '18 at 0:16
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (__new__
) - one important distinction is that the static factory method can be meaningfully named.
– Wes Doyle
Nov 20 '18 at 2:11
add a comment |
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the__new__()
item?
– David L
Nov 19 '18 at 23:53
also, what does the linefactory = staticmethod(factory)
do?
– David L
Nov 19 '18 at 23:59
@HenryH updated to use thestaticmethod
decorator, which allows us to call the decorated methodfactory
from an uninstantiated object.
– Wes Doyle
Nov 20 '18 at 0:16
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (__new__
) - one important distinction is that the static factory method can be meaningfully named.
– Wes Doyle
Nov 20 '18 at 2:11
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the
__new__()
item?– David L
Nov 19 '18 at 23:53
thanks, this certainly seems like the easiest approach. Out of curiosity, what would be the difference between using this approach and using the
__new__()
item?– David L
Nov 19 '18 at 23:53
also, what does the line
factory = staticmethod(factory)
do?– David L
Nov 19 '18 at 23:59
also, what does the line
factory = staticmethod(factory)
do?– David L
Nov 19 '18 at 23:59
@HenryH updated to use the
staticmethod
decorator, which allows us to call the decorated method factory
from an uninstantiated object.– Wes Doyle
Nov 20 '18 at 0:16
@HenryH updated to use the
staticmethod
decorator, which allows us to call the decorated method factory
from an uninstantiated object.– Wes Doyle
Nov 20 '18 at 0:16
1
1
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
Classes don’t need to explicitly inherit from object in python 3.
– Enrico Borba
Nov 20 '18 at 0:20
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (
__new__
) - one important distinction is that the static factory method can be meaningfully named.– Wes Doyle
Nov 20 '18 at 2:11
@HenryH there are a few good reasons to use a static factory method rather than use the constructor (
__new__
) - one important distinction is that the static factory method can be meaningfully named.– Wes Doyle
Nov 20 '18 at 2:11
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53383957%2fpython-how-to-subclass-while-calling-parent-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Perhaps you should be implementing
__new__()
- that lets you create and return an instance of an appropriate subclass, based on the parameters that were passed.__init__()
is too late to do any such thing, the object has already been created.– jasonharper
Nov 19 '18 at 23:17
@jasonharper could you please show how that would be done in the above?
– David L
Nov 19 '18 at 23:19
@jasonharper what would I return in the
__new__
method? Would it bereturn MySQLConnectionManager()
?– David L
Nov 19 '18 at 23:32