使用类中定义的方法/属性/函数的通用语法。(Python文档没有给出如何使用它们的示例)

2024-04-24 19:29:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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。我想知道如何在给定的q1中使用(语法)所有这些方法/属性/函数。(我不知道什么是属性/函数/方法?我只是为了关键字匹配而输入的)

  1. 在这里,我观察到两类方法:一种是两端带有双下划线的方法,另一种是没有下划线的方法。例如,__abs__bit_length。这两个子类之间的基本区别是什么?

  2. 我只想知道有没有一个通用的术语来说明如何使用这些方法?例如,我必须对哪些方法使用.?如何使用它们?请举几个例子。例如,__eq__是相等的函数。我想检查q1是否等于5。我的代码是:

print(q1.eq(5))

输出为:

AttributeError:'int' object has no attribute 'eq'

看来我没用好。你的回答将帮助我知道如何使用在任何给定类下定义的方法/属性/函数。你知道吗


Tags: 方法函数reducebytes属性initdirbit
1条回答
网友
1楼 · 发布于 2024-04-24 19:29:31

我会对你的问题给出一个高层次的答案,但我建议你看一下Python documentation以得到更深入的答案。你知道吗

1)一个对象基本上有两种类型的属性。对象可以有instance attributes,这些instance attributes为基础分配给每个对象,并且class attributes这些class attributes对象的所有实例都可以访问。你知道吗

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

在本例中,创建的每个Employee实例都有实例属性namebadge_number,这是特定于该实例的,但是请注意每个Employee实例如何访问类属性has_benefits,该属性对于所有Employee都设置为True。你知道吗

function是一些可以用名称调用的代码,而method是一些可以用与对象关联的名称调用的代码。还有一个instance method接受self参数作为第一个参数

def show_something():
    print('Show something')

class MyClass(object):

    # method
    def display_something():
        print('Display something')

    # instance method
    def print_something(self):
        print('Print something')


>> show_something()
>> 'Show something'
>>
>> MyClass.display_something()
>> 'Display something'
>>
>> mc = MyClass()
>> mc.print_something()
>> 'Print something'

注意函数show_something只是一些我们可以按名称调用的代码。另外,请注意方法display_something是如何绑定到类对象的,实例方法print_something是如何绑定到对象的实例的。mc.print_something()MyClass.print_something(mc)相同

2)在对象上运行dir()会返回对象所有属性的列表。有些属性被认为是被双下划线包围的特殊属性。有些属性是可调用的,我们可以通过将属性传递给内置函数callable()来确定,如果属性是可调用的,它将返回True,否则返回False。你知道吗

没有周围双下划线的属性也是属性,方法也可以是属性。__abs__在运行abs()内置函数时被调用,该函数返回传入对象的绝对值。bit_length是一种返回表示传入对象的位数的方法。是的,您可以使用访问这些属性。(点)语法。你知道吗

>> my_num = 5
>> my_num.real
>> 5
>> callable(my_num.bit_length)
>> True
>> my_num.bit_length()
>> 3
>> my_num.__class__
>> <class 'int'>

3)最后,我们可以定义一个对象,该对象实现一些特殊方法,当我们运行特定操作(如成员资格测试和获取集合长度)时,Python会使用这些方法。我将展示一些基本示例:

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

试一试:

>> 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

我希望这有帮助!你知道吗

相关问题 更多 >