Python'da bir sınıf için dosya yolunu nasıl edinirim?


99

Python'da bir C sınıfı verildiğinde, sınıfın hangi dosyada tanımlandığını nasıl belirleyebilirim? C sınıfından veya C dışındaki bir örnekten çalışabilecek bir şeye ihtiyacım var.

Bunu yapmamın nedeni, genellikle aynı klasöre ait dosyaları bir araya getirmekten hoşlanmamdır. Kendini HTML olarak işlemek için Django şablonu kullanan bir sınıf oluşturmak istiyorum. Temel uygulama, şablonun dosya adını, sınıfın içinde tanımlandığı dosya adına bağlı olarak çıkarmalıdır.

Diyelim ki "base / artifacts.py" dosyasına bir LocationArtifact sınıfı koydum, sonra varsayılan davranışın şablon adının "base / LocationArtifact.html" olmasını istiyorum.



2
Bunlar, dosyayı aradığınız modülü bildiğinizi varsayar, bir sınıftan uygulamalarla çalışırken sadece modül dizisine sahip olacağım.
Staale

Yanıtlar:


136

İnceleme modülünü şu şekilde kullanabilirsiniz :

import inspect
inspect.getfile(C.__class__)

1
Neyi farklı yaptığımdan emin değilim ama bunun yerine getfilekullanmak zorunda kaldım: inspect.getmodule(C.__class__)
AJP

4
Not: kullanıcı tarafından oluşturulan sınıflarda çalışmaz
Daniel Braun

8
Bu muhtemelen olmalı inspect.getfile(C). Eğer Cbir sınıftır, daha sonra C.__class__ifade eder objectbir istisna edecek olan TypeError: <module 'builtins' (built-in)> is a built-in class. Sadece bir örnek ciçin kullanmak istediğinizi düşünüyorum inspect.getfile(c.__class__).
cheshirekow

1
Bu , uygun dosya yerine metaclass=abc.ABCMetadöndürdüğü için soyut bir temel sınıfı ( ) genişleten bir sınıf için geçerli değildi /usr/local/lib/python3.7/abc.py. @ JarretHardie'nin çözümü (aşağıda) daha iyi çalıştı.
martian111

inspect.getfile (self .__ class__) benim için çalıştı
diman82

37

Deneyin:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

1
(OP istenilen) C'lik bir örneğinden yol almak için, yerine LocationArtifactile obj.__class__obj LocationArtifact bir örneği olduğu.
martian111

6

Bu Django için yanlış bir yaklaşım ve işleri gerçekten zorluyor.

Tipik Django uygulama kalıbı:

  • / proje
    • /uygulama ismi
      • models.py
      • views.py
      • / templates
        • index.html
        • vb.

1
+1: Django'nun doğal olarak yaptığını yapın ve hayat çok daha basit.
S.Lott

1
Kabul. Django, en az "sihir" içeren çerçevelerden biridir, ancak şablonlar, şablon etiketleri ve uygulamaların, kalıplarının bir parçası olarak bazı beklentileri vardır. Tuhaf sınıf çıkarımları yapmak zorunda kalıyorsanız, muhtemelen yanlış yöne gidiyorsunuzdur.
Soviut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.