我经常想检查对象是否有成员.一个例子是在函数中创建单例.为此,您可以这样使用hasattr:
class Foo(object):
@classmethod
def singleton(self):
if not hasattr(self, 'instance'):
self.instance = Foo()
return self.instance
Run Code Online (Sandbox Code Playgroud)
但你也可以这样做:
class Foo(object):
@classmethod
def singleton(self):
try:
return self.instance
except AttributeError:
self.instance = Foo()
return self.instance
Run Code Online (Sandbox Code Playgroud)
另一种方法更好吗?
编辑:添加了@classmethod...但请注意,问题不是关于如何制作单例,而是如何检查对象中是否存在成员.
编辑:对于该示例,典型用法是:
s = Foo.singleton()
Run Code Online (Sandbox Code Playgroud)
然后s是类型的对象,Foo每次都相同.并且,通常,该方法被多次调用.
我正在尝试使用用C编写的Python库,它没有任何文档.我想使用内省来至少看看模块中有哪些方法和类.有人有一个函数或库我可以用来列出模块中的函数(带参数列表)和类(带方法和成员变量)吗?
是否有一个方法返回符合NSKeyValueCoding协议的对象的所有键?
沿着这条线的东西[object getPropertyKeys]将返回NSString对象的NSArray.它适用于任何符合KVC标准的对象.这种方法存在吗?到目前为止,我还没有找到任何搜索Apple文档的内容.
谢谢,G.
cocoa properties introspection objective-c key-value-observing
这是我们面对装饰时遇到的第一个例子.但是我无法意识到我到底想要什么.
一个名为LOG的简单装饰器.它应该像这样工作:
@LOG
def f(a, b=2, *c, **d):
pass
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Run Code Online (Sandbox Code Playgroud)
将作为参数传递给函数的每个参数显示为其值.
我发现问题比我想象的更难,主要是因为你可以通过许多不同的方式将参数传递给函数(想想带有*c的元组或带有**d的字典).
我试过一个解决方案,但我不确定它是否正确.它有点像这样:
def LOG(fn):
import inspect
varList, _, _, default = inspect.getargspec(fn)
d = {}
if default is not None:
d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
def f(*argt, **argd):
print ('Enter %s' % fn).center(100, '=')
d.update(dict((varList[i], v) for i, v in enumerate(argt)))
d.update(argd) …Run Code Online (Sandbox Code Playgroud) 我需要一种方法来传递属性并获取分配给它的名称.有什么建议?
@property (nonatomic, retain) MyObject *crazyObject;
NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject);
// Above method should return @"crazyObject"
Run Code Online (Sandbox Code Playgroud) introspection objective-c objective-c-runtime declared-property
这个问题意味着更多的是__dir__关于numpy.
我有一个子类numpy.recarray(在python 2.7,numpy 1.6.2),我注意到在对象recarray时没有列出字段名称dir(因此ipython的自动完成功能不起作用).
试图修复它,我尝试覆盖__dir__我的子类,像这样:
def __dir__(self):
return sorted(set(
super(MyRecArray, self).__dir__() + \
self.__dict__.keys() + self.dtype.fields.keys()))
Run Code Online (Sandbox Code Playgroud)
结果是:AttributeError: 'super' object has no attribute '__dir__'.(我发现这里实际上应该在python 3.3中工作......)
作为解决方法,我试过:
def __dir__(self):
return sorted(set(
dir(type(self)) + \
self.__dict__.keys() + self.dtype.fields.keys()))
Run Code Online (Sandbox Code Playgroud)
据我所知,这个有用,但当然不是那么优雅.
问题:
recarray?super-call链),当然,对于没有__dict__...的对象recarray不支持列出其字段名称开头?仅仅是疏忽?我有一个类型为T的泛型类,我想获得实例化时传递给类的类型的名称.这是一个例子.
class MyClass<T> {
func genericName() -> String {
// Return the name of T.
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找几个小时,我似乎无法找到任何方法来做到这一点.有人试过这个吗?
任何帮助是极大的赞赏.
谢谢
我正在使用Python 2.x,我有一个我正在从以太召唤的对象; 关于它的文件不是特别清楚.我希望能够获得该对象的属性列表以及每个属性的类型.
同样,我想获得该对象的方法列表,以及我可以在该方法上找到的任何其他信息,例如参数的数量和它们各自的类型.
我有一种感觉,我只是在Google搜索中错过了正确的术语.并不是说我想破坏具体细节,但它是Active Directory,所以这总是很有趣.
如果我有一个类,我怎么能列出它的所有实例变量名?
例如:
@interface MyClass : NSObject {
int myInt;
NSString* myString;
NSMutableArray* myArray;
}
Run Code Online (Sandbox Code Playgroud)
我想得到"myInt","myString"和"myArray".有没有办法可以得到一个我可以迭代的名字数组?
我已经尝试过搜索Objective-C文档但找不到任何东西(我也不确定这是什么).
如果我有这样的python函数:
def some_func(arg1, arg2, arg3=1, arg4=2):
Run Code Online (Sandbox Code Playgroud)
有没有办法确定哪些参数是通过关键字从函数内部传递的?
编辑
对于那些问我为什么需要这个的人,我没有真正的理由,它出现在一次谈话中,好奇心让我变得更好.
introspection ×10
python ×6
objective-c ×3
class ×1
cocoa ×1
decorator ×1
exception ×1
generics ×1
hasattr ×1
inheritance ×1
kwargs ×1
logging ×1
properties ×1
python-2.5 ×1
python-2.7 ×1
swift ×1
types ×1