Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用类中定义的方法/属性/函数的通用语法。(Python文档没有给出如何使用它们的示例)_Python_Python 3.x_Syntax - Fatal编程技术网

使用类中定义的方法/属性/函数的通用语法。(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