-
如果一个类表现得像一个list,想使用len()函数来获取元素个数时,则需要实现__len__()方法。
通过自定义__len__()方法,可以让len()函数返回相关的结果,如果没有定义__len__()方法的类使用len()函数获取长度时,将会引起异常。
class Class:
def __init__(self, students):
self.students = students
def __len__(self):
return len(self.students)
students = ['Alice', 'Bob', 'Candy']
class_ = Class(students)
len(class_) # ==> 3查看全部 -
直接str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'
在类内部定义str后,可以打印任何我们想要的信息
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return 'name: {}, gender: {}'.format(self.name, self.gender)
bob = Person('Bob', 'Male')
str(bob) # ==> 'name: Bob, gender: Male'终端输入bob # ==> '<__main__.Person object at 0x7fc77b859c50>'
当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法。
也在类中定义rep,终端直接输bob也可以打印任何我们想要的信息
def __repr__(self):
return 'name: {}, gender: {}'.format(self.name, self.gender)>>> bob
'name: Bob, gender: Male'查看全部 -
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)求的是最大公约数,可以举个例子代入(2,4)就清楚了
def __str__(self):
g = gcd(self.p, self.q)
return '{}/{}'.format(int(self.p/g), int(self.q/g))约分
查看全部 -
f = Fib()
print(f(10))
__call__把对象当成一个函数来使用
查看全部 -
参考
查看全部 -
关于调用两种方法的时机
使用print()时
使用%s和f'{}'拼接对象时
使用str(x)转换对象x时
在上述三种场景中,会优先调用对象的__str__()方法;若没有,就调用__repr__()方法;若再没有,则显示其内存地址。
特别地,对于下面两种场景:
用%r进行字符串拼接时
用repr(x)转换对象x时
则会调用这个对象的__repr__()方法;若没有,则不再看其是否有__str__()方法,而是显示其内存地址。
查看全部 -
class Animal():
查看全部 -
**kw 可变参数
查看全部 -
在定义继承类的时候,有几点是需要注意的:
- class Student()定义的时候,需要在括号内写明继承的类Person
- 在__init__()方法,需要调用super(Student, self).__init__(name, gender),来初始化从父类继承过来的属性
查看全部 -
open()函数:重要的三个参数
1,文件路径:指定需要打开的文件路径
2,打开模式:针对不同文件以及不同操作,会有不同的打开模式
3,编码:设定打开文件的默认编码
查看全部 -
__slots__方法:
只允许类拥有某些属性,不允许外部再次添加属性,如果外部增添类属性,将会报错
查看全部 -
input()函数可以接收外部的输入。
查看全部 -
1、如果类属性和实例属性名字相同时,实例属性的优先级要高于类属性
2、通过实例无法修改类的属性
查看全部 -
如果希望导入模块的指定部分属性或函数,那么使用from...import...语句。
使用from ... import as ...语句,as类似重命名,可以把导入的函数或属性重命名为别的名字。
查看全部 -
如果把一个类实例也变成一个可调用对象,可以实现一个特殊的方法__call__()。
>>> p = Person('Bob', 'Male')
>>> p('Alice') # ==> 用函数的方式调用Person类的实例p
查看全部
举报