重新来审视一下带来乐趣的编程语言 python(1)

126 阅读2分钟

这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

许多大公司都投资人力在 Python 这门语言,Python 今天在 AI、数据分析和科学研究领域都比较活跃。接下来内容可能比较杂,也希望自己能够抓住一条主线给大家分享 python。

这门语言中藏着许多宝藏等着我们去探索,我也是在不断学习中感觉到 python 的一些小 tricks。我们先从一个普通普通的小例子开始,没有什么特别,只要接触过 Python 或者用过 Python 都会用过这个。

接下来创建多项式类Polynomial,在数学中,多项式(polynomial)是指由变量、系数以及他们之间的加、减、乘、幂运算(非负整数次方)得到的表达式。所以描述一个多项需要给出多项式系数 p1.coeffs

class Polynomial:
    pass

p1 = Polynomial()
p2 = Polynomial()

p1.coeffs = 1,2,3
p2.coeffs = 2,3,2

这里定义了一个多项式,然后我们通过定义

x2+2x+32x2+3x+2x^2 + 2x + 3\\ 2x^2 + 3x + 2

我们可以将上面多行语句,来减少到 2 行,我们可以将 coeffs 赋值工作定义类内的 __init__ 在实例化时候会调用这个内建的函数。接下来我们就来聊一聊在 python 中 以__ 开头和结束的函数,这些函数实现一个类似协议,top-level 也就是更高

class Polynomial:
    def __init__(self,*coeffs):
        self.coeffs = coeffs

p1 = Polynomial(1,2,3)
p2 = Polynomial(2,3,2)
python -i demo_01.py 
p1
#<__main__.Polynomial instance at 0x104d9db48>

我们进一步希望调用实例输出多项式的参数,这些参数可以看做多项式特征。我们可以通过覆盖 python 的内建方法 __repr__ 来反应。

class Polynomial:
    def __init__(self,*coeffs):
        self.coeffs = coeffs

    def __repr__(self):
        return 'Polynomial(*{!r})'.format(self.coeffs)

上层函数,当我们将创建类传入到repr函数时候我们就会调用类中 __repr__ 方法,

In [1]: class Base:
   ...:     def __repr__(self):
   ...:         return "base class"
   ...:

In [2]:

In [2]: base = Base()

In [3]: repr(base)
Out[3]: 'base class'

我们初始化一个类的时候也会调用对应 __init__

>>> p1
Polynomial(*(1, 2, 3))
def __add__(self,other):
    return Polynomial(*(x + y for x,y in zip(self.coeffs,other.coeffs)))

这样当我们使用操作符对两个 Polynomial 对象进行加法运算时候,就会调用对应 __add__ 函数,我们就是这里实现两个多项式相加的逻辑。

p1 + p2

还有以下场景,就是我们在 libary 文件夹中定义 Base 类,然后在库外部定义一个类Derived 继承于 Base

class Base:
  pass
class Derived(Base):
  pass
class Base:
  def foo(self):
    return 'foo'

因为 BaseDerived 来自不同文件,由不同开发人员来完成代码,而且可能多个人调用 Base ,问题是当 Base 发生变化了,将 foo 方法名进行变更或者

class Derived(Base):
  def bar(self):
    return self.foo()

在子类中

assert hasattr(Base,'foo'),"not found foo method"
class Derived(Base):
  def bar(self):
    return self.foo()
class Base:
  def foo(self):
    return self.bar()
class Derived(Base):
  def bar(self):
    return 'bar'