Как наследовать методы класса и обеспечить им доступ к переменным-членам в Python - PullRequest
4 голосов
/ 02 сентября 2011

Я новичок в Python, и я пытался найти лучший способ перенести кучу беспорядочных методов класса (которые обращаются к переменным-членам) в отдельный модуль типа Utils.py для очистки.Имена методов все еще должны быть унаследованы базовым классом, но они также должны иметь доступ к методам класса parnet.Я детализирую фон, потому что я думаю, что мог бы быть лучший способ решения этой проблемы на python.

По сути, мне нужно сделать что-то вроде следующего, если я пытался сделать это с помощью наследования: (Япоиграл с супер, но я не смог решить это таким образом)

class Graph(GraphUtils):
    graph_size = 10
    def print_size(self):
        print self.graph_size

class GraphUtils():
    def set_size(self, new_size)
        self.graph_size = new_size

if __name__ == "__main__":
    g = Graph()
    print "Graph default size: " + str(g.graph_size) # This is 10
    g.set_size(20)
    g.print_size() # I want it to print 20, but it'll print the default 10

Я знаю, что есть еще один способ объединения для импорта методов и переменных класса в другой класс, но я запускаю пространство имен рискаколлизии.

Техника, которую я использовал в аналогичном случае, когда отдельный модуль требовался для появления в нашей библиотеке в качестве надстройки, выглядела следующим образом: (идея надстройки возникла изжелание дополнительно распространять дополнительные функции на класс Graph, все это связано с лицензированием)

class Graph:
    ext = None
    graph_size = 10
    def __init__(self):
        self.ext = Extension()
        self.ext._graph = self

    def set_size(self, new_size):
        self.graph_size = new_size

class Extension:
    _graph = None
    def process(self):
        print "Processing graph size: " + str(self._graph.graph_size)

if __name__ == "__main__":
    g = Graph()
    print "Graph default size: " + str(g.graph_size) # This is 10
    g.set_size(20)
    g.ext.process()
    # Output: Processing graph size: 20

Просто интересно, что вы, ребята, считаете лучшим подходом, или это может быть разумно (безопасно) реализовано в Python.(2.6 +)

Спасибо!

1 Ответ

4 голосов
/ 02 сентября 2011

Решением этой проблемы является определение переменных в методе класса __init __ () и инициализация унаследованного объекта.

__ init __ () - это магический метод класса, который вызывается при создании нового объекта из определения класса.

# Inherit object for new-style Python classes (recommended)
class GraphUtils(object):
    # Override the __init__() magic-method.
    def __init__(self):
        # Initialize the inherited object by executing its __init__() method.
        super(GraphUtils, self).__init__()

    def set_size(self, new_size):
        self.graph_size = new_size

# Inherit GraphUtils
class Graph(GraphUtils):
    def __init__(self):
        # Initialize the inherited GraphUtils object.
        super(Graph, self).__init__()
        # Declare the graph_size variable on creation of a new Graph object.
        self.graph_size = 10

    def print_size(self):
        print self.graph_size

if __name__ == "__main__":
    g = Graph()
    # It is recommended to use str.format() instead of string concatonation
    print "Graph default size: {}".format(g.graph_size) # will print "Graph default size: 10"
    g.set_size(20)
    g.print_size() # This will print 20

http://docs.python.org/reference/datamodel.html#basic-customization

http://docs.python.org/glossary.html#term-new-style-class

http://docs.python.org/library/functions.html#super

http://docs.python.org/library/string.html#string-formatting

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...