对于为什么setattr在绑定方法上失败感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍setattribut,并为您提供关于android–为什么SafetyNetAttestation停止工
对于为什么setattr在绑定方法上失败感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍setattribut,并为您提供关于android – 为什么SafetyNet Attestation停止工作?、Android:关于Intents,为什么setType()和setData()互相无效?、c# – .NET:为什么TryParseExact在Hmm和Hmmss上失败?、hasattr() getattr() setattr() 函数使用方法的有用信息。
本文目录一览:- 为什么setattr在绑定方法上失败(setattribut)
- android – 为什么SafetyNet Attestation停止工作?
- Android:关于Intents,为什么setType()和setData()互相无效?
- c# – .NET:为什么TryParseExact在Hmm和Hmmss上失败?
- hasattr() getattr() setattr() 函数使用方法
为什么setattr在绑定方法上失败(setattribut)
在以下情况中,使用以下命令setattr
在第一次调用中成功,但是在第二次调用中失败:
AttributeError: ''method'' object has no attribute ''i''
为什么会这样,并且有一种方法可以在方法上设置属性,使其仅存在于一个实例上,而不是针对类的每个实例?
class c: def m(self): print(type(c.m)) setattr(c.m, ''i'', 0) print(type(self.m)) setattr(self.m, ''i'', 0)
Python 3.2.2
答案1
小编典典简短的答案:无法将自定义属性添加到绑定方法。
长答案如下。
在Python中,有 函数对象 和 方法对象 。当定义一个类时,该def
语句创建一个 函数对象 ,该 对象 位于该类的名称空间中:
>>> class c:... def m(self):... pass...>>> c.m<function m at 0x025FAE88>
函数对象具有特殊的__dict__
属性,可以保存用户定义的属性:
>>> c.m.i = 0>>> c.m.__dict__{''i'': 0}
方法对象是不同的野兽。它们是微小的对象,仅持有对相应功能对象(__func__
)的引用,并对其宿主对象(__self__
)的引用:
>>> c().m<bound method c.m of <__main__.c object at 0x025206D0>>>>> c().m.__self__<__main__.c object at 0x02625070>>>> c().m.__func__<function m at 0x025FAE88>>>> c().m.__func__ is c.mTrue
方法对象提供了一种特殊__getattr__
的功能,可将属性访问转发给功能对象:
>>> c().m.i0
对于该__dict__
属性也是如此:
>>> c().m.__dict__[''a''] = 42>>> c.m.a42>>> c().m.__dict__ is c.m.__dict__True
但是,设置属性遵循默认规则,并且由于它们没有自己的__dict__
属性,因此无法设置任意属性。
这类似于定义__slots__
且没有__dict__
插槽的用户定义类,当尝试设置一个不存在的插槽时会引发一个AttributeError
(请参阅文档,__slots__
以获取更多信息):
>>> class c:... __slots__ = (''a'', ''b'')...>>> x = c()>>> x.a = 1>>> x.b = 2>>> x.c = 3Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: ''c'' object has no attribute ''c''
android – 为什么SafetyNet Attestation停止工作?
突然之间,对API的所有调用都开始失败. SafetyNet Attestation API发生了什么事吗?
解决方法
以前,可以在没有API密钥的情况下使用SafetyNet Attestation API,并且您将获得默认配额(未专门分配给您的项目).现在不推荐使用此默认配额.
共享配额的使用不必要地将您的流量暴露给项目特定的限制,并且可能导致API的其他用户出错.
在2018年4月左右,Google开始阻止使用此默认配额的SafetyNet Attestation API的新用户(由应用程序的软件包名称标识).
大多数现有客户端现在使用API密钥,但如果您的项目没有,则所有未经API密钥的未授权流量将从2018年8月1日起永久失败.
如果您在没有密钥的情况下使用SafetyNet Attestation API,则必须使用密钥. The good news is that doing so is free,and it’s very easy!
Android:关于Intents,为什么setType()和setData()互相无效?
我回答了this question关于为什么setType()和setData()不能一起工作的原因.我仍然找不到任何理由.逻辑逃避了我.
来自文档:Intent Documentation
To set only the data URI, call setData(). To set only the MIME type, call setType(). If necessary, you can set both explicitly with setDataAndType().
Caution: If you want to set both the URI and MIME type, do not call setData() and setType() because they each nullify the value of the other. Always use setDataAndType() to set both URI and MIME type.
解决方法:
您需要阅读源代码,但可能是因为以下原因.
setType(),setData()和setDataAndType()都在单个数据字段上运行.该字段实际上是两个字段,类型和数据的组合.类型占据一个部分,数据占另一部分.所以说该字段是16位,键入高8位,数据低8位.
setType()可以执行如下操作:
field = (type & 0x0F) << 8;
如您所见,它完全覆盖了字段.所以无论之前有什么,它现在只包含类型信息.
setData可以执行如下操作:
field = data & 0x0F;
正如您所看到的,它也完全覆盖了字段.
setDataAndType()然后必须做类似的事情:
field = ((type & 0x0F) << 8) || (data & 0x0F);
虽然它完全覆盖了字段,但它允许在一次调用中设置数据和类型.
至于为什么事情就是这样 – 可能是以下两个原因之一:
>向后兼容性.编写setType和setData时没有预料到有人可能想要同时执行这两个操作(或者甚至是这样的用例).在将来的某个时候,该要求或用例发生了变化.但是,应用程序已经开始依赖于该行为.因此,为了避免破坏它们,他们引入了一种新方法而不是重载现有方法.
>这种方式更好. setType()和setData()被故意设计为具有破坏性,以防止用户意外地编写难以追查和理解的错误.这样,有人无法调用setType(),然后使用setData()指定不兼容的数据,让URI在一行中工作,但稍后会失败意外.相反,界面会强制用户明确他们想要的内容.
c# – .NET:为什么TryParseExact在Hmm和Hmmss上失败?
var formats = new[] { "%H","HH","Hmm","HHmm","Hmmss","HHmmss",}; var subjects = new[] { "1","12","123","1234","12345","123456",};
然后我尝试解析它们并打印出结果:
foreach(var subject in subjects) { DateTime result; DateTime.TryParseExact(subject,formats,CultureInfo.InvariantCulture,DateTimeStyles.NoCurrentDateDefault,out result); Console.WriteLine("{0,-6} : {1}",subject,result.ToString("T",CultureInfo.InvariantCulture)); }
我得到以下内容:
1 : 01:00:00 12 : 12:00:00 123 : 00:00:00 1234 : 12:34:00 12345 : 00:00:00 123456 : 12:34:56
对我的问题,为什么在123和12345失败?不应该是01:23:00和01:23:45吗?我在这里缺少什么?那我怎么能按照我的期望得到它的工作呢?
更新:所以,似乎我们可能已经弄清楚为什么这是失败的.似乎H实际上是抓住两位数字,然后只留下一个mm,然后会失败.但是,有没有人有一个很好的想法,我可以如何更改这个代码,以便我得到我正在寻找的结果?
另一个更新:想想我现在找到了一个合理的解决方案.将其添加为答案.将会在2天内接受,除非有人想出更好的一个.谢谢您的帮助!
解决方法
所以,我的解决方案目前是改为使用以下三种格式:
var formats = new[] { "%H","Hm","Hms",};
随着我的问题的其余代码保持不变,我会得到这样的结果:
1 : 01:00:00 12 : 12:00:00 123 : 12:03:00 1234 : 12:34:00 12345 : 12:34:05 123456 : 12:34:56
我认为应该是合理和可接受的:)
hasattr() getattr() setattr() 函数使用方法
1. hasattr(object, name)
判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;
>>>
>>> class A():
name = ''python''
def func(self):
return ''A()类的方法func()''
>>>
>>> hasattr(A, ''name'')
True
>>>
>>> hasattr(A, ''age'')
False
>>>
>>> hasattr(A, ''func'')
True
>>>
2. getattr(object, name[, default])
获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况,一种是没有default参数时,会直接报错;给定了default参数,若对象本身没有name属性,则会返回给定的default值;如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();
另外还需要注意,如果给定的方法func()是实例函数,则不能写getattr(A, ''func'')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), ''func'')();实例函数和类函数的区别可以简单的理解一下,实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;
>>>
>>> class A():
name = ''python''
def func(self):
return ''Hello world''
>>>
>>> getattr(A, ''name'')
''python''
>>>
>>> getattr(A, ''age'') # age变量不存在则报错
Traceback (most recent call last):
File "<pyshell#464>", line 1, in <module>
getattr(A, ''age'')
AttributeError: class A has no attribute ''age''
>>>
>>> getattr(A, ''age'', 20)
20
>>>
>>> getattr(A, ''func'')
<unbound method A.func>
>>>
>>> getattr(A, ''func'')() # func()函数不能被A类对象调用,所以报错
Traceback (most recent call last):
File "<pyshell#470>", line 1, in <module>
getattr(A, ''func'')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>>
>>> getattr(A(), ''func'')()
''Hello world''
>>>
>>> class A(object):
name = ''python''
@classmethod
def func(cls):
return ''the method of A object.''
>>>
>>> getattr(A, ''func'')()
''the method of A object.''
>>>
3. setattr(object, name, value)
给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;
>>>
>>> class A():
name = ''python''
def func(self):
return ''Hello world''
>>>
>>> setattr(A, ''name'', ''java'')
>>> getattr(A, ''name'')
''java''
>>>
>>> setattr(A, ''age'', 20)
>>> getattr(A, ''age'')
20
>>>
一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值;很简单的if-else判断:
>>>
>>> class A():
name = ''python''
def func(self):
return ''Hello world''
>>>
>>> if hasattr(A, ''age''):
print getattr(A, ''age'')
else:
setattr(A, ''age'', 20)
>>>
>>> getattr(A, ''age'')
20
>>>
我们今天的关于为什么setattr在绑定方法上失败和setattribut的分享就到这里,谢谢您的阅读,如果想了解更多关于android – 为什么SafetyNet Attestation停止工作?、Android:关于Intents,为什么setType()和setData()互相无效?、c# – .NET:为什么TryParseExact在Hmm和Hmmss上失败?、hasattr() getattr() setattr() 函数使用方法的相关信息,可以在本站进行搜索。
本文标签: