python支持面向对象, 其中类的概念和其他编程语言相同
类, 在python中, 和模块差不多, 可以理解为工具包, 被导入使用, 但又不是完全相同
类与面向对象
类的定义, 来源于生活, 比如人类, 鸟类, 是一种抽象的定义( 并不是一个真实的个体), 但又确实有特定的行为和特征. 比如人类不是指你或者我, 但一说到人类, 就会想到, 一对手一对脚, 直立行走, 吃饭说话等
在类中, 有2个重要的东西, 分别是:
- 特征 –> 主要是指一些静态的东西, 比如头, 耳朵, 等等, 这里的静态指的是主观静态, 仅仅表示存在这样一个东西, 在类中表示为属性
- 行为 –> 主要是主观动态的东西, 比如人可以说话, 这是一个能力, 在类中表示为方法
其实, 这跟模块非常相似, 参考以前学的random模块,
- 面向过程 –> 生成随机数, 手动写代码实现
- 面向对象 –> 生成随机数, 找工具包实现
适当的把代码封装成类, 可以把长代码恰当的划分, 逻辑更清晰
ps: 在python中, 基础的数据类型也是类, 比如整型类, 列表都可以理解为一种”类”, 在ipython中, 可以使用dir(变量)来查看所有的属性和方法, 内置方法名(__方法名__)
一些常见的内置方法
__new__ | 创建对象时, 被自动调用 |
__init__ | 对象初始化时, 被自动调用 |
__del__ | 对象销毁前, 被自动调用 |
__str__ | 返回对象的描述信息, print函数默认调用 |
__str__相当于其他语言的toString()方法, 默认打印16进制地址
类的设计
命名是一个重要哲学, 在python中, 类应该满足大驼峰命名策略
所谓大驼峰命名, 是指每个单词的首字母都是大写的, 比如 KeyWord, DataUtils, 单词中间没有下划线分隔
此外, 要考虑属性和方法, 也就是类中有什么特征和方法
类基本定义语法
仅包含方法的类定义如下, 先记住方法第一个参数必须是self
class 类名:
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
和模块不同的是, 类不能直接被调用, 而是必须对象调用, 这里暂不细说, 简单格式为
对象变量 = 类名()
类定义实例
class Person:
def eat(self, something):
print("吃:"+something)
def sleep(self, hours):
print("每天睡:"+str(hours)+"小时")
#调用类, 创建对象
xiaoming = Person()
xiaoming.eat("水果")
xiaoming.sleep(8)
#一个类可以创建无数对象, 可以看成是一个模板
xiaohong = Person()
xiaohong.eat("牛奶")
xiaohong.sleep(10)
类的属性
属性, 是类的重要组成之一, python的类属性, 和其他编程语言有一些不太一样
在python中, 可以直接使用 .属性名 的方式, 调用, 修改, 或增加
例如, 以下实例
xiaoming.name="小明"
print(xiaoming.name)
xiaoming.name="大明"
print(xiaoming.name)
但是, 这种方式是不推荐的, 这样仅仅作用于对象实例上, 而没有在类上
定义在类上, 语法大概是这样
class 类名:
变量1 = 值1
变量2 = 值2
def 方法1(self):
pass
def 方法2(self):
pass
定义在类中, 与类方法并排的叫类属性, 但这样的成员属性很不灵活, 下一节将和类构造方法一起讲解
ps: 类的属性, 往往也叫成员变量, 类的方法, 也叫成员方法
python的对象
对象, 是一个类的实例, 也即是一个真实的个体
例如, 人类是模糊的概念, 那么”张三”就是一个真实个体, 前者是类, 后者是对象
对象由类创建而来, 上面的例子就有用到, 比如
class Person:
def eat(self, something):
print("吃:"+something)
def sleep(self, hours):
print("每天睡:"+str(hours)+"小时")
#调用类, 创建对象
zhangsan= Person() #zhangsan是一个对象
lisi = Person() #lisi也是一个对象
对象必须由类创建而来, 对象是真实占有内存的, 而类是创建对象的模板, 它们是互相依存的, 简单理解为: 没有类就无法创建对象, 没有对象就无法真正执行
其实类和对象都只是一个称呼而已, 每一样真实存在的都可以是对象, 每一种抽象的东西都可以理解为类。