abc don't play well with private method
mouadino
mouadino at gmail.com
Wed May 5 10:36:44 EDT 2010
i have a problem here :
i want to make a plugin architecture using abstract base class , this
is my base class :
# -*- coding: utf-8 -*-
import abc
class BASE_Connector:
"""
Mount point for plugins which refer to actions that can be
performed.
Plugins implementing this reference should provide the following
methods:
======== ========================================================
connect the connection method that will initialize a transport
layer
__login the login method to use to login in to the server
this one should be called from connect directly
get this method is use for getting the files from the
remote server
close this method is called for closing the connection
suddenly
quit this method is more polite to close the connection
======== ========================================================
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def connect(self, host, user="", passwd="", port="",
private_key_file="", timeout=100):
""" connect to a remote server this function call the __login
function after the connection is established
-- host : remote server name
-- user : the user name in the remote server
Default : empty string for server that don't need
authentication or use private key instead
-- passwd : password of the user given
Default : empty string for server that don't need
authentication or use private key instead
-- port : the connection port
Default : it's known from the protocol
-- private_key_file : the file containing the private
key used special for ssh connection
Default : empty string
-- timeout : the timeout of the connection
Default : empty string
"""
pass
@abc.abstractmethod
def __login(self):
""" private method to login to the remote server .
it use the user name and the password or the private key
for that
"""
@abc.abstractmethod
def get(self, remote_file_path, local_path="/tmp/
housead_matcher"):
""" method to download the file from the remote server
-- remote_file_path : the path of the file in the remote
server
-- local_path : the local path where the file will be
save
"""
pass
@abc.abstractmethod
def close(self):
""" Close the connection unilaterally(from this host)
"""
@abc.abstractmethod
def quit(self):
""" close the connection. This is the “polite” way to close a
connection
"""
and i define my plugins in a differents module like this :
class FTP_Connector(FTP, Base_Connector) :
""" this class is for the connection to a ftp server
"""
def __init__(self):
FTP.__init__()
def connect(self, host, port, user, passwd, timeout=""):
self.connect(host, port, timeout)
self.___login(user, passwd)
def ___login(self, username="", password=""):
self.login(username, password)
def get(self, remote_file_path, local_path):
remote_file_path = os.path.expanduser(remote_file_path)
local_path = os.path.expanduser(local_path)
remote_directory, remote_file_name =
os.path.split(remote_file_path)
local_file = os.path.join(local_path, remote_file_name)
self.cwd(remote_directory)
self.retrlines("RETR " + remote_file_name, lambda s,
w=local_file.write: w(s+"\n"))
def close(self):
self.close()
def quit(self):
self.quit()
and when i test my code i get this error :
Can't instantiate abstract class FTP_Connector with abstract methods
_BASE_Connector__login
i can understand why. but my problem is why why ? i can't put
"private" method in the ABC class ???
More information about the Python-list
mailing list