Python基础知识点总结:数据分析从0到大师必Mark的一篇!(下)-数据与编程-热点资讯-野望文存-科技 
    欢迎来到野望文存-科技!
当前位置:野望文存-科技 > 热点资讯 > 数据与编程 >  Python基础知识点总结:数据分析从0到大师必Mark的一篇!(下)

Python基础知识点总结:数据分析从0到大师必Mark的一篇!(下)

发表时间:2020-08-01 15:01:00  来源:野望文存  浏览:次   【】【】【

TK |  作者
LearnKu | 翻译
https://www.freecodecamp.org/news/learning-python-from-zero-to-hero-120ea540b567/



注:篇幅过长以分为两篇发出,上篇

5


类型与对象


1. 一点基础理论


对象代表现实世界中像轿车、狗、自行车这些事物。对象具有数据行为两个主要特征。

在面向对象编程中,我们把数据当作属性,把行为当作方法。即数据 → 属性行为 → 方法

类型是创造单个对象实例的蓝本。在现实世界中,我们经常发现很多对象实例拥有相同的类型,比如轿车。他们都具有相同的构造和模型(具有发动机,轮子,门等等)。每辆车都是根据同一张设计图制作的,并且具有相同的组成部分。

2. Python 的面向对象编程模式:ON


Python,作为一门面向对象编程的语言,具有对象的概念。

类是蓝图,对象是模型

同样,一个类,它只是一个模型,或者一种定义属性和行为的方法(正如我们在理论部分所讨论的)。例如,车辆类有自己的属性,定义什么是车辆。车轮的数量、能源的类型、座位容量和最大速度都是车辆的属性。

考虑到这一点,让我们看看类的Python语法:

class Vehicle:
   pass

我们用一个类声明来定义类?,仅此而已。很简单,不是吗?

对象是一个类的实例,我们用命名类来创建一个实例。

car = Vehicle()
print(car) # <__main__.Vehicle instance at 0x7fb1de6c2638>

这里 ‘car’ 是 ‘Vehicle’ 类的一个对象(或者说实例)。

记住,我们的 ‘Vehicle’ 类有四个属性:轮子数量,能源类型,座位容量,和最大速度。我们创建一个 ‘Vehicle’ 对象时设置所有这些属性 。所以在这里,我们定义我们的类初始化时要接收数据时:

class Vehicle:
   def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
       self.number_of_wheels = number_of_wheels
       self.type_of_tank = type_of_tank
       self.seating_capacity = seating_capacity
       self.maximum_velocity = maximum_velocity

我们使用了 ‘init’方法。我们称它为构造方法。所以创建 ‘vehicle’ 对象时可以定义这些属性。假设我们喜欢Tesla Model S,我们要创建这种对象。它有4个轮子,使用电能,有5个座位,最大时速250km/h (155mph)

tesla_model_s = Vehicle(4, 'electric', 5, 250)

4个“轮子”+电能“能源”+5个“座位”+250km/h“最大速度”。

所有属性都设置完成了。但是我们如何获取这些属性值?我们发送一个消息到对象来问他们。我们称之为方法,方法是对象的行为,让我们来实现它:

class Vehicle:
   def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
       self.number_of_wheels = number_of_wheels
       self.type_of_tank = type_of_tank
       self.seating_capacity = seating_capacity
       self.maximum_velocity = maximum_velocity

   def number_of_wheels(self):
       return self.number_of_wheels

   def set_number_of_wheels(self, number):
       self.number_of_wheels = number

这里创建了两个方法: number_of_wheels 和 set_number_of_wheels. 我们称它为 获取 & 设置。因为第一个获取了属性值,然后第二个设置了一个新的属性值。

Python 中,我们可以用 “@property” (“decorator”) 去定义 "getters" 和 “setters”。请看以下代码:

class Vehicle:
   def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
       self.number_of_wheels = number_of_wheels
       self.type_of_tank = type_of_tank
       self.seating_capacity = seating_capacity
       self.maximum_velocity = maximum_velocity

   @property
   def number_of_wheels(self):
       return self.number_of_wheels

   @number_of_wheels.setter
   def number_of_wheels(self, number):
       self.number_of_wheels = number

同时,我们可以使用这些方法作为属性:

tesla_model_s = Vehicle(4, 'electric', 5, 250)
print(tesla_model_s.number_of_wheels) # 4
tesla_model_s.number_of_wheels = 2 # setting number of wheels to 2
print(tesla_model_s.number_of_wheels) # 2

这个与定义方法有些许不同。这些方法的工作机制与属性不同。例如,当我们设置轮子数量时,我们需要把2赋值给一个变量,只需要设置 “number_of_wheels” 的值为2。这是一种写 “pythonic”、 ”getter“、“setter” 代码的方法。

而且同时我们也可以使用其他方法,比如 “make_noise” 方法。请看下面的例子:

class Vehicle:
   def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
       self.number_of_wheels = number_of_wheels
       self.type_of_tank = type_of_tank
       self.seating_capacity = seating_capacity
       self.maximum_velocity = maximum_velocity

   def make_noise(self):
       print('VRUUUUUUUM')

当我们调用这个方法时,它返回字符串 ”VRRRRUUUUM“。

tesla_model_s = Vehicle(4, 'electric', 5, 250)
tesla_model_s.make_noise() # VRUUUUUUUM


6


封装:信息隐藏

封装是一种限制直接访问对象数据和方法的机制。但是它加快了对象方法中数据的访问。

"封装可以在定义中隐藏数据和函数成员,意味着从外部隐藏了对象定义中的内部描述“--- Wikipedia

对象从外部隐藏了其内部描述。只有对象可以与它的内部数据进行交互。

首先,我们需要了解 “public” “non-public” 变量实例的工作机制。

1. Public 变量实例


对于一个 Python 类型,我们可以使用构造方法初始化一个公共变量实例。我们看这个:

通过构造方法:

class Person:
   def __init__(self, first_name):
       self.first_name = first_name

这里我们使用 “first_name” 的值作为一个参数传递给公共变量实例。

tk = Person('TK')
print(tk.first_name) # => TK

在类中:

class Person:
   first_name = 'TK'

这里,我们不需要使用 “first_name” 作为一个参数,所有的对象实例都有一个用 “TK” 初始化的类属性。

tk = Person()
print(tk.first_name) # => TK

漂亮。我们已经学习到可以使用公共变量实例和类型属性。另一件关于 “public” 部分有趣的事情是我们可以管理它的变量的值。我的意思是什么呢?我们的对象可以管理它的变量值:获取和设置变量值

记住 “Person” 类,我们想要设置另一个值给它的 “first_name” 变量:

tk = Person('TK')
tk.first_name = 'Kaio'
print(tk.first_name) # => Kaio

好了,我们刚刚设置了另一个值("kaio")给对象变量 “first_name”,并且它更新了它的值。就是这么简单,因为这个 “public” 变量,我们可以这样做。


2. Non-public 变量实例


“在这里,我们不用‘私有‘来形容 ,因为在Python中没有真正“私有”的属性(避免了一般情况下不必要的工作)。”---?PEP 8

和公共变量实例一样,我们可以在构造函数或类内部定义非公共变量实例。语法上的差异是:对于非公共变量实例,我们在变量名前加一道下划线(_)

“在Python中,无法从内部访问‘私有’变量实例的对象是不存在的。但是,大多数Python代码遵循一个惯例:一个名字前有一道下划线的对象应该被认为是API中非公共的部分,例如_spam,无论它是一个函数、方法或是数据成员。”?---?Python Software Foundation

这是一个例子:

class Person:
   def __init__(self, first_name, email):
       self.first_name = first_name
       self._email = email

看到email变量了吗?这就是定义一个非公共变量的方法。

tk = Person('TK', 'tk@mail.com')
print(tk._email) # tk@mail.com

所谓非公共变量只是一个惯例,没有机制禁止我们从外部访问并更新它。但按照惯例,我们应该把它作为API中非公共的部分来对待。

在类内部,我们通常使用方法来操作“非公共变量”,让我们实现两个方法(email和update_email)来理解。

class Person:
   def __init__(self, first_name, email):
       self.first_name = first_name
       self._email = email

   def update_email(self, new_email):
       self._email = new_email

   def email(self):
       return self._email

现在,我们可以通过这些方法来访问、更新非公共变量。

tk = Person('TK', 'tk@mail.com')
print(tk.email()) # => tk@mail.com
tk._email = 'new_tk@mail.com'
print(tk.email()) # => tk@mail.com
tk.update_email('new_tk@mail.com')
print(tk.email()) # => new_tk@mail.com

  • 我们以first_name TK 和 email tk@mail.com 初始化一个Person对象

  • 通过方法访问非公共变量 email,并打印出来

  • 从类外部直接设置一个新的email

  • 我们应该把非公共变量作为API中非公共的部分来对待

  • 通过实例方法更新非公共变量 email

  • 成功!我们可以通过预设的方法来更新它


3. 公共方法


通过 公共方法, 我们也可以在我们类的外部使用这些方法了:

class Person:
   def __init__(self, first_name, age):
       self.first_name = first_name
       self._age = age

   def show_age(self):
       return self._age

让我们来试下:

tk = Person('TK', 25)
print(tk.show_age()) # => 25

赞——用起来没有任何问题。


4. 非公共方法


但是通过 非公共方法 我们却无法做到这一点。我们先来实现一个同样的 Person 类,不过这回我们加个下划线(_)来定义一个 show_age 的非公共方法。

class Person:
   def __init__(self, first_name, age):
       self.first_name = first_name
       self._age = age

   def _show_age(self):
       return self._age

那么现在,我们来试着通过我们的对象调用这个 非公共方法:

tk = Person('TK', 25)
print(tk._show_age()) # => 25

我们可以访问并且更新它。 非公共方法 只是一类约定俗成的规定,并且应当被看做接口中的非公共部分。

关于我们该怎么使用它,这有个例子:

class Person:
   def __init__(self, first_name, age):
       self.first_name = first_name
       self._age = age

   def show_age(self):
       return self._get_age()

   def _get_age(self):
       return self._age

tk = Person('TK', 25)
print(tk.show_age()) # => 25

这里我们有一个 _get_age 非公共方法和一个show_age 公共方法。show_age可以由我们的对象调用(在类的外部)_get_age只能在我们类定义的内部使用(内部show_age方法)。但是再次强调下,这只是个约定俗成的规定。

5. 封装总结


通过封装我们可以从外部隐藏对象的内部表示。

7


继承:行为和特征


某些对象具有共同点:如行为特征

例如,我从我父亲那里继承了一些特征和行为。我继承了他的眼睛和头发作为特征,继承了他的急躁和内向作为行为。

在面向对象编程中,类能够从其他类中继承特征(数据)和行为(方法)

让我们看另外一个例子。

假定一辆车。轮子的数量、载客量和最高时速是车的所有属性。那么我们可以认为ElectricCar类从这个Car类中继承了这些属性。

class Car:
   def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
       self.number_of_wheels = number_of_wheels
       self.seating_capacity = seating_capacity
       self.maximum_velocity = maximum_velocity

我们的Car类实现之后:

my_car = Car(4, 5, 250)
print(my_car.number_of_wheels)
print(my_car.seating_capacity)
print(my_car.maximum_velocity)

一旦初始化后,我们可以使用所有已创建的实例变量。很好。

在Python中我们可以将父类作为子类定义时的参数。一个ElectricCar类能从之前的Car类中继承。

class ElectricCar(Car):
   def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
       Car.__init__(self, number_of_wheels, seating_capacity, maximum_velocity)

简单如上。我们不需要实现任何其他的方法,因为这个类已经有了(继承自Car类)。让我们确认一下:

my_electric_car = ElectricCar(4, 5, 250)
print(my_electric_car.number_of_wheels) # => 4
print(my_electric_car.seating_capacity) # => 5
print(my_electric_car.maximum_velocity) # => 250

漂亮。就到这里!

恭喜!你完成了Python的这段密集的内容。

坚持学习,坚持编程,祝你玩得开心!

END -
本文为转载分享&推荐阅读,若侵权请联系后台删除

责任编辑:蔡学森