Nó có thể không được thực hiện thường, mặc dù điều này có thể đạt được bằng cách sử dụng cơ sở vật chất mẫn và có nghĩa là cho gỡ một chương trình. Mã phải chạy từ tệp ".py", chứ không phải từ mã bytecode được biên dịch, hoặc bên trong mô-đun đã nén - vì nó dựa vào việc đọc mã nguồn của tệp, từ bên trong phương thức sẽ tìm thấy "nó ở đâu đang chạy".
Bí quyết là truy cập khung thực thi nơi đối tượng được khởi tạo từ - với inspect.currentframe - đối tượng khung có giá trị "f_lineno" cho biết số dòng nơi cuộc gọi đến phương thức đối tượng (trong trường hợp này, __init__
) đã được gọi. Hàm inspect.filename cho phép truy xuất mã nguồn của tệp và tìm nạp số dòng thích hợp.
Phân tích cú pháp ngây thơ sau đó xem trước phần đã đặt trước dấu "=" và giả sử đó là biến chứa đối tượng.
from inspect import currentframe, getfile
class A(object):
def __init__(self):
f = currentframe(1)
filename = getfile(f)
code_line = open(filename).readlines()[f.f_lineno - 1]
assigned_variable = code_line.split("=")[0].strip()
print assigned_variable
my_name = A()
other_name = A()
Điều đó sẽ không làm việc cho nhiều assignents, biểu thức sáng tác với các đối tượng trước khi assignemtn được thực hiện, đối tượng được nối thêm vào danh sách hoặc thêm vào từ điển hoặc bộ, đối tượng instantiation trong intialization của for
vòng, và có Chúa mới biết nhiều tình huống hơn - Và hãy nhớ rằng sau lần ghi nhận đầu tiên, đối tượng có thể được tham chiếu bởi bất kỳ biến số nào khác.
dòng Botton: nó là có thể, nhưng như một món đồ chơi - nó không thể được sử dụng i mã sản xuất - chỉ có tên varibal để được thông qua như là một chuỗi trong quá trình khởi đối tượng, cũng giống như người ta phải làm khi tạo một
các "đúng cách" collections.namedtuple
để làm điều đó, nếu bạn đang cần tên, là phải vượt qua một cách rõ ràng tên cho khởi đối tượng, như một tham số chuỗi, như trong:
class A(object):
def __init__(self, name):
self.name = name
x = A("x")
Và vẫn còn, nếu hoàn toàn cần phải gõ các đối tượng'name chỉ một lần, có là một cách khác - đọc tiếp. Do cú pháp của Python, một số nhiệm vụ đặc biệt, không sử dụng toán tử "=" cho phép một đối tượng biết nó được gán tên. Vì vậy, các statemtns khác thực hiện các phép gán trong Python là các từ khóa for, with, def và class - Có thể lạm dụng nó, như một tạo lớp và định nghĩa hàm là các câu lệnh gán tạo các đối tượng "biết" tên của chúng.
Hãy tập trung vào tuyên bố def
. Nó thường tạo ra một hàm. Nhưng sử dụng một trang trí, bạn có thể sử dụng "def" để tạo ra bất kỳ loại đối tượng - và có tên được sử dụng cho các chức năng có sẵn cho các nhà xây dựng:
class MyObject(object):
def __new__(cls, func):
# Calls the superclass constructor and actually instantiates the object:
self = object.__new__(cls)
#retrieve the function name:
self.name = func.func_name
#returns an instance of this class, instead of a decorated function:
return self
def __init__(self, func):
print "My name is ", self.name
#and the catch is that you can't use "=" to create this object, you have to do:
@MyObject
def my_name(): pass
(Bằng cách này, cuối cùng làm việc đó thể được sử dụng trong mã sản xuất, không giống như một trong đó khu du lịch để đọc các tập tin nguồn)
Nó không phải là có thể - mặc dù thời gian gần đây (3-4 months ago) trên Python-ý tưởng liệt kê đã có một số cuộc thảo luận về việc thêm khả năng cho một cái gì đó như thế này. – jsbueno
Câu trả lời ngắn gọn là: không, đừng thử ..và câu trả lời thực sự là có, nhưng đừng thử .. :) – wim