Tôi đang phân loại một loại được xác định trong mô-đun C để đặt bí danh một số thuộc tính và phương thức sao cho tập lệnh của tôi hoạt động trong các ngữ cảnh khác nhau.Phương thức bị bỏ qua khi phân loại một loại được định nghĩa trong mô-đun C
Làm cách nào để làm việc này, tôi phải tinh chỉnh từ điển của lớp học theo cách thủ công? Nếu tôi không thêm tham chiếu đến DistanceTo
trong từ điển, tôi nhận được Point3d has no attribute named DistanceTo
.
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X':property(lambda self: self.x),
'Y':property(lambda self: self.y),
'Z':property(lambda self: self.z),
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
Tôi đã nghĩ rằng một khi __new__
đã trả lại một trường hợp tôi vẫn có thể điền nó bằng các phương pháp và thuộc tính. Bất cứ ai có thể làm sáng tỏ về điều này ?
EDIT: Mô-đun tôi nhập từ là FreeCAD. Loại cơ sở C được xác định there. Sau đó, Vector có nguồn gốc hình thức định nghĩa này here
EDIT2: Tôi cũng thử như sau:
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X': x, 'Y': y, 'Z': z,
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
và sau khi tạo một điểm thứ hai, cả hai Point3D p
trả về giá trị của điểm cuối cùng cho p.X
, p.Y
và p.Z
không có vấn đề gì các thông số x,y,z
được thông qua khi tạo cá thể. p.x, p.y, p.z
trả lại giá trị mong đợi. Dường như cho biết từ điển được chia sẻ giữa các phiên bản.
CHỈNH SỬA 3: Sự cố được giải quyết! Bit Py_TPFLAGS_BASETYPE được đặt thành 0 để ngăn phân lớp phụ như được giải thích trong câu trả lời dưới đây.
Tôi nghĩ đây là câu trả lời hợp lệ nhưng tôi khuyên bạn nên hỏi những câu hỏi tiếp theo trong một câu hỏi mới thay vì ở đây. – MSeifert
Xin lỗi, tôi sẽ mở một câu hỏi mới sau khi thực hiện một số nghiên cứu. –