Sto scrivendo un wrapper di alto livello sull'oggetto Python socket.socket
. Nello specifico, voglio farlo per i socket TCP IPv4 (anche se sarebbe utile poter espandere la libreria in un secondo momento con altre famiglie / tipi). Come forse saprai, il modulo socket definisce questi come socket.AF_INET
e socket.SOCK_STREAM
. È una buona idea "copiare" queste costanti e renderle costanti attributi di classe, cioè:
import socket
class IPv4TCPSocket(socket):
FAMILY = socket.AF_INET
TYPE = socket.SOCK_STREAM
def __init__(self):
...
O dovrei fare riferimento a loro direttamente? Questa potrebbe sembrare una domanda strana visto che sono già costanti nel modulo socket
, ma riferirsi ad esse con <libname>.socket.AF_INET
potrebbe essere un po 'imbarazzante. Qualche idea su questo?
In alternativa, non esco dagli attributi della classe e inizializzo in questo modo:
super().__init__(family=socket.AF_INET, type=socket.SOCK_STREAM)
Questo lascia completamente un riferimento alla famiglia e al tipo di socket, che non è un problema, a meno che qualcun altro debba creare un socket personalizzato (o derivarne uno da IPv4TCPSocket
):
from <name> import IPv4TCPSocket as sock
print("Creating a new socket with family {} and type {}!".format(sock.FAMILY, sock.TYPE))
Contrariamente a
import <libname>
print("Creating a new socket with family {} and type {}!".format(<libname>.socket.AF_INET, <libname>.socket.SOCK_STREAM))
È un po 'più di lavoro e non mi sembra un'interfaccia pubblica intuitiva per me. E hey, potrei semplicemente trasformarlo in un problema più grande di quanto sia in realtà, ma lo faccio molto:)
Seconda modifica: nuove idee sull'argomento. Dopo aver letto il commento di James, ho scoperto (ancora, duh!) Che socket.socket.type
e socket.socket.family
esistono, che restituiscono rispettivamente il tipo e la famiglia dell'istanza socket. Quindi, dal momento che voglio separare il comportamento di classe su un tipo & base familiare, non posso affatto sottoclasse socket
. La domanda rimane la stessa, tuttavia, poiché ciascuna di queste istanze wrapper richiede anche un attributo privato di _socket
di ordinamento.
L'unico vero motivo che posso trovare è quello di rendere l'interfaccia pubblica più facile da usare. O potrei anche lasciare gli attributi del tutto dal momento che il nome della classe descrive il socket. Decisioni, decisioni.
Le risposte sono ancora benvenute, ma ho deciso di rimuovere le costanti e lasciare che il nome della classe significhi la sua famiglia e il tipo.