Python札记38_定制类

浏览: 1024

类是对象,类也是对象类型。字符串、列表、字典等都是Python中自定义的对象类型。

  • isinstance(object, class-type-tuple) --->bool;返回的是bool
  • isintance(a, Person):判断a是不是Person类的实例
  • 魔术方法
    • _str_: print的输出
    • _repr_:交互式环境下的输出

类和对象类型

class C1:
pass

class C2:
pass

c = C1()
d = C2()

print(type(c)) # <class 'type'>
print(type(d)) # <class 'type'>

image.png

m = 1
isinstance(m,int) # True

m = "hello world"
isinstance(m,int) # False

image.png

创建一个类就是创建了一个对象类型


定制类

如果想自定义类,就要使用类的特殊方法,比如初始化函数init(),通过一个例子来了解其他特殊方法:

class RoundFloat:   # 定义一个类,类名首字母大写
def __init__(self, val): # 初始化函数,传入参数val
assert isinstance(val, float), "value must be a float" # assert 断言:判断val是否是float类型,不是就抛出后面的异常信息
self.value = round(val, 2) # round函数是返回浮点数的四舍五入值

def __str__(self): # 定义特殊方法__str__():得到打印的内容
return "{:.2f}".format(self.value) # format用法,保留两位有效数字

__repr__ = __str__ # 将__str__()方法得到的内容传给__repr__变量;__repl__是在交互式环境里的输出,__str__是print()的输出

if __name__ == "__main__":
r = RoundFloat(3.1415926) # 创建实例r,并且调用类
print(r)
print(type(r))

结果:

3.14     # 保留两位有效数字
<class '__main__.RoundFloat'>

显示分数的类

整个代码的编写思路:

  • 将分子和分母当做两个参数传入函数中
  • 利用str()方法进行输出
class Fraction:  # 定义一个类
def __init__(self, number, demon): # 传入两个参数
self.number = number # 两个属性的赋值
self.demon = demon

def __str__(self): # __str__():魔术方法,用于输出
return str(self.number) +"/" + str(self.demon)

__repr__ = __str__ # repr是交互式环境下的输出,str是print语句的输出


if __name__ == "__main__":
a = Fraction(2,3)
print(a)

分数求和

最大公约数和最小公倍数

  • 最大公约数,Greatest Common Divisor, gcd
  • 最小公约数,Lowest Common Mutiple, lcm
  • lcm(a, b) = (a*b)/gcd(a, b)
def gcd(a, b):    # 最大公约数
if not a > b: # 如果a小于b,交换a、b的位置;保证下面的被除数a大于b
a, b = b, a
while b != 0:
remainder = a % b # %表示求余数,5%2余数是1
a, b = b, remainder # 将b赋值给a,余数赋值给b
return a # 返回的a就是最大公约数:了解下辗转相除法

def lcm(a, b): # 最小公倍数
return (a * b) / gcd(a, b) # 最小公倍数和最大公约数的关系:lcm(a, b) = (a*b) / gcd(a, b)

if __name__ == "__main__":
print("最大公约数:",gcd(8,20))
print("最小公倍数:",lcm(8,20))

结果:

最大公约数: 4
最小公倍数: 40.0
  • 第一步:20/8 = 2...4,a=8,b=4
  • 第二步:8/4=2,a=4, b=0;此时a就是最大公约数

# 求两个分数相加
def gcd(a, b): # 最大公约数
if not a > b: # 如果a小于b,交换a、b的位置;保证下面的被除数a大于除数b
a, b = b, a
while b != 0:
remainder = a % b # %表示求余数,5%2余数是1
a, b = b, remainder # 将b赋值给a,余数赋值给b
return a # 返回的a就是最大公约数:了解下辗转相除法

def lcm(a, b): # 最小公倍数
return (a * b) / gcd(a, b) # 最小公倍数和最大公约数的关系:lcm(a, b) = (a*b) / gcd(a, b)


class Fraction: # 定义一个类
def __init__(self, number, demon): # 传入两个参数
self.number = number # 两个属性的赋值
self.demon = demon

def __str__(self): # __str__():魔术方法,用于输出
return str(self.number) + "/" + str(self.demon) # 直接调用上面的两个属性

__repr__ = __str__ # repr是交互式环境下的输出,str是print语句的输出

def __add__(self, other): # 默认other是Fraction的一个实例,具有F的所有属性
lcm_num = lcm(self.demon, other.demon) # 调用最小公倍数方法
number_sum = (lcm_num / self.demon * self.number) + (lcm_num / other.demon * other.number)
return Fraction(number_sum, lcm_num) # 返回F类的结果

if __name__ == "__main__":
m = Fraction(1,3)
n = Fraction(1,2)
s = m + n
print(m,"+",n,"=",s)

通过导入模块来实现

from fractions import Fraction
m, n = Fraction(1, 4), Fraction(2, 5)
m + n

Fraction(13, 20)
推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册