使用类中定义的方法/属性/函数的通用语法。(Python文档没有给出如何使用它们的示例)
输出为:使用类中定义的方法/属性/函数的通用语法。(Python文档没有给出如何使用它们的示例),python,python-3.x,syntax,Python,Python 3.x,Syntax,输出为: import random as rd q1 = rd.randint(1,10) print(dir(q1)) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format
import random as rd
q1 = rd.randint(1,10)
print(dir(q1))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
一,。我想知道如何为我给定的q1使用(语法)所有这些方法/属性/函数。(我不知道什么是属性/函数/方法?我只是键入它们进行关键字匹配)
\uuu abs\uuu
和位长度
。这两个子类别之间的基本区别是什么
?如何使用它们?请举例说明。例如,\uuuuu eq\uuuu
是相等的函数。我想检查q1是否等于5。我的代码是:打印(q1.eq(5))
输出为:
import random as rd
q1 = rd.randint(1,10)
print(dir(q1))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
看起来我没有正确使用它。您的答案将帮助我了解如何使用在任何给定类下定义的方法/属性/函数 我会对你的问题给出一个高层次的回答,但我建议你看一下,以获得更深入的答案 1) 一个对象可以具有两种类型的属性。对象可以具有
实例属性
,这些属性按每个对象分配,并且类属性
该对象的所有实例都可以访问
AttributeError:'int' object has no attribute 'eq'
在本例中,创建的每个员工实例都具有特定于该实例的实例属性name
和badge\u number
,但请注意,每个员工实例如何访问所有员工的类属性has\u benefits
,该属性设置为True
函数
是一些可以通过名称调用的代码,而方法
是一些可以通过与对象关联的名称调用的代码。还有一个实例方法
,它接受self
参数作为第一个参数
class Employee(object):
has_benefits = True # class attribute
def __init__(self, name, badge_number):
self.name = name # instance attribute
self.badge_number = badge_number # instance attribute
>> e1 = Employee('bob', 123)
>> e1.name
>> 'bob'
>> e1.has_benefits
>> True
>>
>> e2 = Employee('sarah', 456)
>> e2.name
>> 'sarah'
>> e2.has_benefits
>> True
请注意,函数show_something只是一些我们可以按名称调用的代码。另外,请注意方法display\u something
如何绑定到我们的类对象,实例方法print\u something
如何绑定到我们的对象实例mc.print\u something()
与MyClass.print\u something(mc)
2) 在对象上运行dir()
,将返回该对象所有属性的列表。某些属性被认为是由双下划线包围的特殊属性。有些属性是可调用的,我们可以通过将属性传递给内置函数callable()
来确定,如果属性是可调用的,则该函数将返回True
,否则返回False
没有周围双下划线的属性也是属性,方法也可以是属性\uuuu abs\uuuu
在运行abs()
内置函数时被调用,该函数返回传入对象的绝对值bit_length
是一种返回表示传入对象的位数的方法。是的,您可以使用访问这些属性。(点)语法
试一试:
class MyCollection(object):
def __init__(self, data):
self.my_data = data
def __contains__(self, item):
return item in self.my_data
def __len__(self):
return len(self.my_data)
def __iter__(self):
for item in self.my_data:
yield item
def __add__(self, rhs):
if not isinstance(rhs, MyCollection):
return NotImplemented
return self.my_data + rhs.my_data
def __eq__(self, rhs):
if not isinstance(rhs, MyCollection):
return NotImplemented
return self.my_data == rhs.my_data
def __ne__(self, rhs):
if not isinstance(rhs, MyCollection):
return NotImplemented
return self.my_data != rhs.my_data
我希望这有帮助 尝试打印(q1.\uuuueq\uuuu5))首先,
键入(q1)
不会返回该值。这看起来像是dir(q1)
的值。在任何情况下,这些都是属性名称,因此可以使用这些名称访问它们。然而,大多数“dunder”方法,即\uuuuux\uuuuu
都是一些特殊的钩子,可以钩住操作符之类的东西。你通常不会直接使用那些可能重复的答案。Tl;dr:方法是包含函数的类属性;可以使用instance.method(arglist)
符号调用实例方法,该符号与klass.method(instance,arglist…)
相同。双下划线方法是特殊的,通常实现非方法语法,如运算符。特别是,q1.\uuuueq\uu5)
是在执行q1==5
时在后台调用的。非常感谢您帮助我理解Python函数、方法和属性。在您的整个回答中,我喜欢和期望的是:在两端和其他地方用双下划线解释属性。我想知道,有没有一种通用的方法来告诉我们可以用这种方式使用
double_underline'属性和用这种方式使用“non underline”属性。这个答案帮助我理解每个属性。此外,我喜欢将这些东西应用到不同的函数中。两端带有双下划线的属性被认为是底层Python机制使用的“特殊”属性,如我在上面的回答中所示。通常,如果我们想获得对对象的更多控制,我们会覆盖这些特殊属性。您可以使用点语法访问所有属性,无论它们是否是“特殊”属性,并且没有一般规则来告诉我们何时应该访问每个属性。您可以在需要时访问每个属性。就这么简单!如果你喜欢这个答案,也许可以接受它,这样其他人也会受益
>> mc1 = MyCollection([1,2,3,4,5])
>> mc2 = MyCollection([6,7,8,9])
>> mc3 = MyCollection([1,2,3,4,5])
>>
>> 3 in mc1 # calls __contains__
>> True
>>
>> len(mc1) # calls __len__
>> 5
>>
>> [item for item in mc1] # calls __iter__
>> [1,2,3,4,5]
>>
>> mc1 + mc2 # calls __add__
>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>
>> mc1 == mc2 # calls __eq__
>> False
>>
>> mc1 != mc2 # calls __ne__
>> True
>>
>> mc1 == mc3 # calls __eq__
>> True