Получение пути к файлу модуля производного класса через наследование - PullRequest
6 голосов
/ 19 января 2010

Предположим, у вас есть следующее:

$ more a.py
import os

class A(object):
    def getfile(self):
        return os.path.abspath(__file__)

-

$ more b.py
import a

class B(a.A):
    pass

-

>>> import b
>>> x=b.B()
>>> x.getfile()
'/Users/sbo/tmp/file/a.py'

Это понятно. Не удивительно из этого кода. Предположим, однако, что я хочу, чтобы x.getfile () возвращал путь к b.py без необходимости определять другую копию getfile () в классе B.

Я сделал это

import os
import inspect

class A(object):
    def getfile(self):
        return os.path.abspath(inspect.getfile(self.__class__))

Мне было интересно, есть ли другая стратегия (и в любом случае я хочу написать ее здесь, чтобы она могла быть полезна для других) или потенциальные проблемы с решением, которое я представляю.

CW, поскольку это скорее вопрос для обсуждения, или вопрос типа да / нет

Ответы [ 2 ]

10 голосов
/ 19 января 2010
sys.modules[self.__class__.__module__].__file__
2 голосов
/ 15 марта 2016

удалось получить эту работу в Python 3 следующим образом:

import os

class Parent:

    def __init__(self, filename=__file__):
        self.filename = filename

    def current_path(self):
        pth, _ = os.path.split(os.path.abspath(self.filename))
        return pth

Затем в другом модуле ...

from practice.inheritance.parent import Parent

class Child(Parent):

    def __init__(self):
        super().__init__(__file__)

... доступ к current_path() с любого изParent или Child возвращает соответствующий путь к модулю, как и ожидалось.

>>> from practice.inheritance.parent import Parent
>>> parent = Parent()
>>> print(parent.current_path())
/Users/davidevans/PycharmProjects/play35/practice/inheritance

>>> from practice.inheritance.subpackage.child import Child
>>> child = Child()
>>> print(child.current_path())
/Users/davidevans/PycharmProjects/play35/practice/inheritance/subpackage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...