저는 현재 파이썬에서 처음으로 더 큰 프로젝트를 작성하고 있으며 클래스의 하위 클래스 클래스 본문에서 실행할 수 있도록 클래스 메소드를 정의하는 방법에 대해 궁금합니다.Ruby가 파이썬에서 DSL을 사용합니다.
첫 번째로 더 많은 내용을 들려주고, (이 질문에 필수적이지 않은 모든 것을 제거했습니다.) 루비에서 내가하려고하는 일을 어떻게 수행하는지 예 : 클래스를 정의하면 Item
처럼 이 : 지금까지 내가 파이썬에서 비슷한 일을 달성하려고 지금
class MyItem < Item
define_field("name")
end
item = MyItem.new
item.name = "World"
puts "Hello #{item.name}!"
을,하지만 난 내가 지금까지있어 결과에 만족하지 않다 :
class Item
def initialize(data={})
@data = data
end
def self.define_field(name)
define_method("#{name}"){ instance_variable_get("@data")[name.to_s] }
define_method("#{name}=") do |value|
instance_variable_get("@data")[name.to_s] = value
end
end
end
I는 다음과 같이 사용할 수 있습니다 :
class ItemField(object):
def __init__(self, name):
self.name = name
def __get__(self, item, owner=None):
return item.values[self.name]
def __set__(self, item, value):
item.values[self.name] = value
def __delete__(self, item):
del item.values[self.name]
class Item(object):
def __init__(self, data=None):
if data == None: data = {}
self.values = data
for field in type(self).fields:
self.values[field.name] = None
setattr(self, field.name, field)
@classmethod
def define_field(cls, name):
if not hasattr(cls, "fields"): cls.fields = []
cls.fields.append(ItemField(name, default))
이제 define_field
을 하위 클래스의 본문에서 호출하는 방법을 알 수 없습니다. 이것은 내가 그것이 가능하다는 것을 바란 것입니다 :
class MyItem(Item):
define_field("name")
item = MyItem({"name": "World"})
puts "Hello {}!".format(item.name)
item.name = "reader"
puts "Hello {}!".format(item.name)
이 this similar question이야하지만 답변을 아무도 정말 만족없고, 누군가가 __func__()
과 기능을 caling 권장하지만 난 할 수 없어 추측이 내가 할 수 없기 때문에 익명의 몸체에서 클래스에 대한 참조를 얻으십시오. (이 문제에 대해 제가 틀렸다면 수정하십시오.) 다른 사람은 이것을하기 위해 모듈 레벨 함수를 사용하는 것이 더 낫다고 지적했습니다. 이것은 또한 가장 쉬운 방법이라고 생각합니다 ,하지만이 일을하는 주된 의도는 하위 클래스의 구현을 깨끗하게 만들고 해당 모듈 함수를로드해야하는 것이 좋지 않을 수도 있다는 것입니다. (또한 클래스 클래스 밖에서 함수 호출을해야 할 것입니다.하지만 이건 지저분하다고 생각합니다.)
기본적으로 파이썬은 허용되지 않도록하기 때문에 내 접근 방식이 잘못되었다고 생각합니다. 이런 종류의 일을해야합니다. Ruby 예제에서와 같이 Python으로 뭔가를 달성하는 가장 좋은 방법은 무엇입니까?
(이미 단지 define_field
방법에 대한 매개 변수의 배열을 반환하는 서브 클래스의 메소드를하는 것에 대한 생각했습니다 더 좋은 방법이 없다면.)
을 나는 아마 내 질문에 충분히 명확하지 않았다 미안 해요 ,하지만 내 진짜 문제는 하위 클래스에서'define_field' 메서드를 호출하는 방법을 잘 모르겠다는 것입니다. 방금 내 질문을 편집했습니다. – evotopid
오, 나는 그것이 가능하다고 생각하지 않는다. 그래도'__init__' 안에서 할 수 있습니다. – Kroltan