考虑以下Python(在2.x或3.x中运行):
class Outer(object):
pass
class Inner(object):
def __init__(self):
print("Inner.self", self)
o = Outer()
i = o.Inner()
我想把手放在o
里面Inner.__init__()
。但:
o
成为的显式参数Inner
。O.Inner
和o.Inner
成为一个类的对象,不是很奇怪像关闭。您能建议我如何实现这一目标吗?
现在,我最好的主意是使用线程本地存储。在我的用例中,每当我构造一个时o.Inner()
,我已经在o
某个地方的方法中,并且添加没什么大不了的
threading.local()["my o object"] = o
对我的代码。
这使您对我愿意考虑的堕落程度有所了解。
在Python 2.6中,也是自定义描述符的类装饰器匹配您提供的规范:
class InnerClassDescriptor(object):
def __init__(self, cls):
self.cls = cls
def __get__(self, instance, outerclass):
class Wrapper(self.cls):
outer = instance
Wrapper.__name__ = self.cls.__name__
return Wrapper
class Outer(object):
@InnerClassDescriptor
class Inner(object):
def __init__(self):
print self.outer
o = Outer()
i = o.Inner()
print 'Outer is a', type(Outer)
print 'Inner is a', type(o.Inner)
这发出:
<__main__.Outer object at 0x82f90>
Outer is a <type 'type'>
Inner is a <type 'type'>
只是为了确认
o.Inner [[is]]是一个类对象,而不是像闭包那样奇怪的东西
根据您的特殊规格。当然,每次重入都需要使用 不同的 类-即使在单线程环境中,以下内容也是如此:
o1 = Outer()
o2 = Outer()
i1 = o1.Inner
i2 = o2.Inner
print i1(), i2(), i1(), i2()
应该可以正常工作,并且将o1 vs
o2存放在o1.Inner
比vs返回的类之外的其他任何地方o2.Inner
(例如,在TLS中)将意味着这种用法的可怕结果。
但你 并没有 注明“o.Inner
必须是 完全相同 的同一类对象 的每个
可能o
这就是实例Outer
”,所以这段代码完全满足您的规格 没有 给予;-)。
问题内容: 我有以下代码。我想掌握用来创建内部类对象的外部类对象。我该怎么做? 编辑:好,你们中的一些人建议通过添加方法来修改内部类: 但是,如果我没有控制权来修改内部类,那(只是确认一下),我们还有其他方法可以从内部类对象中获取相应的外部类对象吗? 问题答案: 在内部类本身中,你可以使用。该表达式允许引用任何词法包围的实例,在JLS中被描述为。 我认为没有办法从内部类的代码之外获取实例。当然,你
问题内容: 我的代码中有内部类。我想授予对其实例的公共访问权限,但是只有外部类才可以创建此实例,就像在“私有”访问权限中一样。是否可以不做适当的小包装(或为每个这样的内部类创建公共接口)? (对不起,如果我的英语不好:P) 问题答案: 有可能的。将 内部类 声明为 public,但将其构造函数声明为private 。这样,您只能在封闭的类及其内部内部创建它,而不能从外部创建它。
问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:
问题内容: 如果我有一个内部类的实例,如何 从不在内部类中的代码 访问外部 类 ?我知道在内部类中,我可以用来获取外部类,但是我找不到任何外部方式来获取此类。 例如: 问题答案: 该类的字节码将包含一个名为type 的包作用域。这就是用Java实现非静态内部类的方式,因为在字节码级别上没有内部类的概念。 如果您确实愿意,您应该能够使用反射来读取该字段。我从来不需要这样做,因此最好更改设计以使其不再
我有两个类:Date和Person Person有Date类的两个属性 案例1 类是与Person类分开的类。我有这段代码正常工作: 案例2:内部类(赋值要求) 我把作为Person的私有内部类 现在,上面的构造函数代码不再工作了。以下是错误消息: 说明资源路径位置类型由于某些中间构造函数调用人员,类型Person的封闭实例不可用。java/Wk03_Ch10_文件IO_Ch13_接口/Wk03_
我目前正在进行一个与Firebase集成的Android项目,但是由于Firebase监听器的原因,我正在努力从Firebase实时数据库中检索类对象。 让我详细介绍一下我的项目,以便你能了解它的主要内容。我使用MVVM架构,我有两个活动,其中一个用于身份验证,另一个用于主要用途。 第一个活动包含注册、登录、密码重置片段第二个活动包含4个用于程序主要功能的片段 第一个活动中的片段使用共享的view