Object-oriented Programming
很多时候我们要描述的东西是比较复杂的。 比如,要描述一个小区,我们可能需要以下信息:
{
'name': '小区名称',
'location': (112.234345, 30.103932),
'developer': '开发商',
'avg_price': 12000,
'buildings': ['#1', '#2', '#3'],
'is_selling': True,
'properties': ['1-101', '1-102', '1-201']
}而且可能还有一些以小区为单位的操作,比如:总户数 count_properties() 。 这些函数是和“小区”这个类型的变量强绑定的,不能应用于其他类型上。 此时使用内置类型就无法满足我们的需要。
对象
Object,一般翻译为“对象”,也被称为“实例”、“实体”。 具有一定关联的变量和函数的集合,用于整体化地描述某个物体、概念或资源, 从而将零散的代码整合起来。
类
类描述一个对象拥有哪些变量和函数。 必须拥有一个 __init__() 函数来初始化变量。
Python 中能用到的所有的变量,都是经过抽象和封装的类对象。


但是:
声明类包含哪些变量和函数的过程。
在构造函数 __init__() 中定义类包含哪些变量。
class Property:
def __init__(self):
self.price = 20000
self.size = 100
self.bedroom = 2
self.bathroom = 1
self.decorated = True
self.community = Community()重要
类的所有函数1都必须包含一个 self 参数,而且必须是第一个参数。
构造函数除了定义变量外,还有一个重要作用是传递变量的初始值。
class Appartment:
def __init__(self, price, size, bedroom, bathroom, decorated, community):
self.price = price
self.size = size
self.bedroom = bedroom
self.bathroom = bathroom
self.decorated = decorated
self.community = community
appartment1 = Appartment(20000, 100, 2, 1, True, comm)
print(appartment1.price).变量名 的方式使用成员变量,也可以修改值。成员函数的编写方法和普通函数一样,但是可以通过 self 调用成员变量,而普通函数是不可以使用 self 的。
class Appartment:
def __init__(self, price, bedroom, bathroom):
self.price = price
self.bedroom = bedroom
self.bathroom = bathroom
def info(self):
print(f"{self.bedroom}b{self.bathroom}b appartment, {self.price} per week.")
appartment1 = Appartment(400, 1, 1)
appartment1.info().函数名(实参) 的方式调用成员函数。self 参数。成员函数也可以有自己的参数,使用自己的参数时无需使用 self。
class RentalAppartment:
def __init__(self, price, bedroom, bathroom):
self.price_per_week = price
self.bedroom = bedroom
self.bathroom = bathroom
def total_rent(self, weeks):
return self.price_per_week * weeks
appart1 = RentalAppartment(400, 1, 1)
appart1.total_rent(52)提示
成员函数参数也可以有默认值。
通过扩展一个类(基类)得到另一个类(子类、派生类)的过程。
提示
super() 表示基类。例如
Cat 类型的变量就可以使用 Animal 的所有成员变量和成员函数。
Python 的一些内置类提供了很多方法。
dict_items([('name', '小区名称'), ('developer', '开发商')])
这是一类特殊的类型,用于表示程序遇到了异常情况。
凡是代码无法正确执行的时候,就会抛出一个异常。
ZeroDivisionError 。IndexError 。TypeError 。NameError 。FileNotFoundError 。HTTPError 。ConnectTimeoutError 。在一些情况下,如果认为当前的情况是一种异常情况,可以使用 raise 手动抛出一个异常。 这表示我们不对当前情况做任何处理,而是交给更上一层的代码块处理。
异常的构造函数通常都有一个参数,用来保存一些信息,这些信息被放在了 args 成员变量中。
提示
异常虽然有很多种类型,但不同类型之间在定义上没有太大的区别。 使用不同异常类型的目的是指示这个异常的性质。 比如当除数是 0 时,使用 ZeroDivisionError 就比 ValueError 更清晰的指出了异常的本质。
在写网络爬虫的时候,正常情况下会获得一个字典,其中有一个键名(字段)是
data,对应的键值表示要获取的数据,可以从中提取出我们需要的信息。 但是有的时候可能会发生一些错误,此时这个字段就消失了。 这时需要抛出一个ValueError的异常,表示获得的结果不对。
格式
提示
循环使用
get_data函数处理下面的返回值列表,并处理的异常。 当遇到异常时,输出一句话,显示是在处理哪个response时发生的异常。
模块