【发布时间】:2019-11-14 19:59:17
【问题描述】:
在Swift 中,您可以定义@dynamicMemberLookup (see documentation) 以直接访问嵌套在其他类型中的属性。是否有 Python 等效项?
我想用Python 实现的示例
假设我有一个有成员的班级,例如:
c = OuterClass()
c.inner_class = ClassWithManyMembers()
c.inner_class.member1 = "1"
c.inner_class.member2 = "2"
c.inner_class.member3 = "3"
我希望能够获取/设置这些成员,而不必每次都输入inner_class:
print(c.member1) # prints "1"
c.member1 = 3
print(c.member1) # prints "3"
Swift (Source) 中的示例:
按成员名称动态查找成员
@dynamicMemberLookup
struct DynamicStruct {
let dictionary = ["someDynamicMember": 325,
"someOtherMember": 787]
subscript(dynamicMember member: String) -> Int {
return dictionary[member] ?? 1054
}
}
let s = DynamicStruct()
// Use dynamic member lookup.
let dynamic = s.someDynamicMember
print(dynamic)
// Prints "325"
通过键路径动态查找成员
struct Point { var x, y: Int }
@dynamicMemberLookup
struct PassthroughWrapper<Value> {
var value: Value
subscript<T>(dynamicMember member: KeyPath<Value, T>) -> T {
get { return value[keyPath: member] }
}
}
let point = Point(x: 381, y: 431)
let wrapper = PassthroughWrapper(value: point)
print(wrapper.x)
我在Python 中唯一的想法是将monkey-patch 的所有嵌套属性直接传递给外部类。
【问题讨论】:
-
您通过成员名称调用 Dynamic 的用例直接在 python 中工作。只是您没有访问 dict 项目的功能。 dyn = s.someDynamicMember,然后是动态['whatever']
标签: python swift monkeypatching keypaths