ฉันจะรับ filepath สำหรับคลาสใน Python ได้อย่างไร


99

เมื่อพิจารณาถึงคลาส C ใน Python ฉันจะทราบได้อย่างไรว่าคลาสถูกกำหนดไว้ในไฟล์ใด ฉันต้องการบางสิ่งที่สามารถทำงานได้จากคลาส C หรือจากอินสแตนซ์จาก C

เหตุผลที่ฉันทำเช่นนี้เป็นเพราะโดยทั่วไปฉันเป็นคนชอบเอาไฟล์ที่อยู่รวมกันในโฟลเดอร์เดียวกัน ฉันต้องการสร้างคลาสที่ใช้เทมเพลต Django เพื่อแสดงผลเป็น HTML การใช้งานพื้นฐานควรอนุมานชื่อไฟล์สำหรับเทมเพลตตามชื่อไฟล์ที่คลาสกำหนดไว้

สมมติว่าฉันใส่คลาส LocationArtifact ในไฟล์ "base / artifacts.py" จากนั้นฉันต้องการให้ลักษณะการทำงานเริ่มต้นคือชื่อเทมเพลตคือ "base / LocationArtifact.html"



2
ผู้ที่สมมติว่าคุณรู้จักโมดูลที่คุณกำลังค้นหาไฟล์ฉันจะมีสตริงโมดูลในขณะที่ฉันทำงานกับการใช้งานนอกคลาส
Staale

คำตอบ:


136

คุณสามารถใช้โมดูลการตรวจสอบดังนี้:

import inspect
inspect.getfile(C.__class__)

1
ไม่แน่ใจว่าสิ่งที่ฉันทำแตกต่างกันไป แต่แทนที่จะgetfileต้องใช้: inspect.getmodule(C.__class__)
AJP

4
หมายเหตุ: ใช้ไม่ได้กับคลาสที่ผู้ใช้สร้างขึ้น
Daniel Braun

8
inspect.getfile(C)นี้อาจจะ หากCเป็นชั้นแล้วC.__class__หมายถึงซึ่งจะเพิ่มการยกเว้นobject TypeError: <module 'builtins' (built-in)> is a built-in classฉันคิดว่าcคุณต้องการใช้สำหรับอินสแตนซ์inspect.getfile(c.__class__)เท่านั้น
cheshirekow

1
สิ่งนี้ไม่ได้เกิดขึ้นกับคลาสที่ขยายคลาสฐานนามธรรม ( metaclass=abc.ABCMeta) เนื่องจากจะส่งคืน/usr/local/lib/python3.7/abc.pyแทนที่จะเป็นไฟล์ที่เหมาะสม วิธีแก้ปัญหาโดย @JarretHardie (ด้านล่าง) ทำงานได้ดีขึ้น
martian111

Inspector.getfile (self .__ class__) ทำงานให้ฉัน
diman82

37

ลอง:

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

1
หากต้องการรับเส้นทางจากอินสแตนซ์ของ C (ตามที่ OP ต้องการ) ให้แทนที่LocationArtifactด้วยโดยobj.__class__ที่ obj เป็นอินสแตนซ์ของ LocationArtifact
martian111

6

นี่เป็นแนวทางที่ผิดสำหรับ Django และบังคับให้ทำสิ่งต่างๆ

รูปแบบแอป Django ทั่วไปคือ:

  • /โครงการ
    • / appname
      • Models.py
      • views.py
      • / แม่แบบ
        • index.html
        • เป็นต้น

1
+1: ทำในสิ่งที่ Django ทำตามธรรมชาติและชีวิตก็ง่ายขึ้นมาก
ล็อต

1
เห็นด้วย Django เป็นหนึ่งในเฟรมเวิร์กที่มี "เวทมนตร์" น้อยที่สุด แต่เทมเพลตแท็กเทมเพลตและแอปมีความคาดหวังบางอย่างเป็นส่วนหนึ่งของรูปแบบ หากคุณต้องทำการอนุมานแบบแปลก ๆ คุณอาจจะไปผิดทาง
Soviut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.