Python38_定制类

类是对象,类也是对象类型。字符串、列表、字典等都是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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容