我想知道何时使用__getattr__或__getattribute__.该文件提到了__getattribute__适用于新样式类.什么是新式课程?
我试图理解上的差异之间__getattr__和__getattribute__,但是,我在它失败.
Stack Overflow问题的答案vs 之间的差异__getattr____getattribute__说:
__getattribute__在查看对象的实际属性之前调用,因此正确实现可能很棘手.您最终可以轻松地进行无限递归.
我完全不知道这意味着什么.
然后继续说:
你几乎肯定想要
__getattr__.
为什么?
我读到如果__getattribute__失败,__getattr__就会被调用.那么为什么有两种不同的方法做同样的事情呢?如果我的代码实现了新的样式类,我应该使用什么?
我正在寻找一些代码示例来清除这个问题.我已经用Google搜索了我的能力,但我找到的答案并没有彻底讨论这个问题.
如果有任何文档,我准备阅读.
我在Python中使用Selenium.我想得到.val()一个<select>元素,并检查它是我期望的.
这是我的代码:
def test_chart_renders_from_url(self):
url = 'http://localhost:8000/analyse/'
self.browser.get(url)
org = driver.find_element_by_id('org')
# Find the value of org?
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?Selenium文档似乎有很多关于选择元素但没有关于属性的内容.
问题是哪一个最好用于哪个用例,而不是技术背景.
在python中,您可以通过属性,描述符或魔术方法来控制属性的访问.哪个用例最具pythonic?所有这些似乎都具有相同的效果(参见下面的例子).
我正在寻找一个答案:
例
用例将是可能无法在__init__方法中设置的属性,例如因为该对象尚未存在于数据库中,而是在稍后的时间.每次访问该属性时,都应尝试设置并返回该属性.
作为在Python shell中使用Copy&Paste的示例,有一个类只想在第二次询问它时才显示其属性.那么,哪一个是最好的方式,还是有不同的情况,其中一个更好?以下是实现它的三种方法:
随着物业 ::
class ContactBook(object):
intents = 0
def __init__(self):
self.__first_person = None
def get_first_person(self):
ContactBook.intents += 1
if self.__first_person is None:
if ContactBook.intents > 1:
value = 'Mr. First'
self.__first_person = value
else:
return None
return self.__first_person
def set_first_person(self, value):
self.__first_person = value
first_person = property(get_first_person, set_first_person)
Run Code Online (Sandbox Code Playgroud)
带__getattribute__::
class ContactBook(object):
intents = 0
def …Run Code Online (Sandbox Code Playgroud) 我正在使用与此代码类似的somethign:
class BaseClass(object):
def __getattr__(self, attr):
return lambda:'1'
class SubClass(BaseClass):
def foo(self):
suffix = '2'
return super(SubClass, self).foo() + suffix
class SubClass2(SubClass):
def foo(self):
suffix = '3'
return super(SubClass2, self).foo() + suffix
o = SubClass2()
print o.foo()
Run Code Online (Sandbox Code Playgroud)
我希望看到'123'的输出,但我得到一个错误AttributeError: 'super' object has no attribute 'foo'.Python甚至没有尝试使用基类__getattr__.
如果不修改基类,并保持两个超级调用相似,我就无法获得我想要的输出.有没有合适的超级电话模式在这里适合我?
我知道super()会以某种方式覆盖getattr以执行它需要做的事情,但是我想问是否有任何合理的解决方法允许__getattr__在适当的时候调用子类.
我正在尝试创建一个子类,作为自定义类的列表.但是,我希望列表继承父类的方法和属性,并返回每个项的数量总和.我试图使用该__getattribute__方法执行此操作,但我无法弄清楚如何将参数传递给可调用属性.下面的高度简化的代码应该更清楚地解释.
class Product:
def __init__(self,price,quantity):
self.price=price
self.quantity=quantity
def get_total_price(self,tax_rate):
return self.price*self.quantity*(1+tax_rate)
class Package(Product,list):
def __init__(self,*args):
list.__init__(self,args)
def __getattribute__(self,*args):
name = args[0]
# the only argument passed is the name...
if name in dir(self[0]):
tot = 0
for product in self:
tot += getattr(product,name)#(need some way to pass the argument)
return sum
else:
list.__getattribute__(self,*args)
p1 = Product(2,4)
p2 = Product(1,6)
print p1.get_total_price(0.1) # returns 8.8
print p2.get_total_price(0.1) # returns 6.6
pkg = Package(p1,p2)
print pkg.get_total_price(0.1) #desired output is 15.4. …Run Code Online (Sandbox Code Playgroud) 可能重复:
JavaScript setAttribute vs .attribute =
javascript dom,如何处理"特殊属性"作为属性?
很多时候,在Usenet的论坛或地方,我被一些人(当批评我的代码时)告诉我,而不是说,例如var link = a.href我应该使用var link = a.getAttribute('href');.并且在想要分配时使用其互补的setAttribute().
他们说这是正确的做法,我错了,等等等等......我通常不会注意那些.当我问为什么没有人给出真正的答案时.
现在我很好奇在哪些情况下更适合使用其中一种或另一种.
在什么情况下更适合说var link = a.getAttribute('href');而不是var link = a.href?
在什么情况下,我使用setAttribute()来分配,而不是直接通过其标识符为成员赋值?即:`a.href ='someURL';
我刚才注意到,如果我给html元素一个自定义属性,例如:
<input type="button" id="my_button" custom_attr="custom_attr_text" value="value_text" />
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样检索它:
document.getElementById("my_button").getAttribute("custom_attr");
Run Code Online (Sandbox Code Playgroud)
它会回来"custom_attr_text",但如果我这样做
document.getElementById("my_button").custom_attr;
Run Code Online (Sandbox Code Playgroud)
然后它回来了undefined!
我还注意到,使用内置属性(例如value或id)以上两种工作都很好!有人可以解释为什么会这样吗?
我有一个javascript函数,试图确定div是否可见,并使用该变量进行各种处理.我成功地通过改变它在none和block之间的显示来交换元素可见性; 但我无法存储这个价值......
我已经尝试获取元素显示属性值并查找元素ID是否可见但是两者都没有效果.当我尝试.getAttribute时,它总是返回null; 我不知道为什么,因为我知道id被定义并且它有一个display属性.
这是我尝试过的两种不同方法的代码:
var myvar = $("#mydivID").is(":visible");
var myvar = document.getElementById("mydivID").getAttribute("display");
Run Code Online (Sandbox Code Playgroud)
任何指导或协助将不胜感激.
在 Chrome 和驱动程序更新到第 91 版后,我发现驱动程序为 91.0.4472.19 (win32) 的 VBA 宏变成了从输入标签“值”属性返回空字符串 (""):
Dim ch As SeleniumWrapper.WebDriver
Dim el As WebElement
' some code here ...
ch.findElementById("htmlLoginId").SendKeys login
Set el = ch.findElementById("htmlLoginId")
txt = el.getAttribute("value")
Run Code Online (Sandbox Code Playgroud)
使用较旧的驱动程序版本 90.0.4430.24,这可以正常工作。希望它会在下一个驱动程序版本中得到修复。
还有另一种方法可以从input[type=text]标签中获取价值吗?如果这个错误不会在第 92 个版本中修复并且第 90 个驱动程序版本变得不兼容,我想避免这种情况。
getattribute ×10
python ×6
getattr ×4
javascript ×3
attributes ×1
descriptor ×1
dom ×1
jquery ×1
members ×1
oop ×1
properties ×1
selenium ×1
setattribute ×1
super ×1
vba ×1
visible ×1
webdriver ×1