类对象
面向对象3大特征:1. 封装 2. 继承 3. 多态(重载、重写)
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print('Person.name',self.name)
class Student(Person[,...]):
def __init__(self, name, age, score):
self.score = score # 父类中没有属性,子类添加属性
Person.__init__(self, name, age) # 调用父类构造函数
def say(self):
print('Person.name',self.name)
def main(self):
super().say() # 调用父类方法。子类和父类存在相同方法
issubclass(Student('Tom', 18, 100), Person) # 检测继承关系
Student.mro() # 返回类的继承顺序
实例化
python是一种面向对象语言,类对象是python中面向对象编程的基础。
思维方式 | 描述 |
---|---|
面向对象 | 类和对象:类是模具,对象是饼干 设计者思维: 宏观:面向对象整体设计 微观:执行和处理数据 使用: class 类名(父类): |
面向过程 | 执行者思维:步骤顺序执行 |
python
class Person:
pass # 空语句
class Person:
def __init__(self, name, age): # 构造函数 名称固定__init__,第一个参数是self,表示实例本身; 定义有参构造函数,需要预留无参构造函数
self.name = name # 实例属性
self.age = age
print('Person.__init__')
def say(self): # 实例方法
print('Person.name',self.name)
s1 = Person('张三', 18) # s1是实例对象,自动调用__init__方法
s1.say()
type(s1) # 对象类型
isinstance(s1, Person) # 判断对象类型
属性和方法
每个类的实例对象都有自己的属性和方法,属性和方法的访问权限不同。
属性 | 方法 |
---|---|
实例属性: self.实例属性 = 初始值 obj = 类名() obj.实例属性 = 初始值 | 实例方法: def 方法(self[,参数列表]):方法体 对象实例.方法() |
类属性: 类名.类属性 = 初始值 | 类方法: @classmethod def 类方法(cls[,参数列表]):方法体 类名.类方法() |
属性 | 私有属性 | 公共属性 |
---|---|---|
定义 | __ 2个_开头 | 其他 |
权限 | 类内部可以访问,类外部不可访问 类外部可以通过__ 类名 __ 私有属性名 | self.属性名 |
python
class Person:
name = '张三' # 类属性
__age = 18 # 私有类属性
@classmethod
def say(cls): # 类方法
print('Person.name',cls.name)
def __init__(self, name, age): # 构造函数 名称固定__init__,第一个参数是self,表示实例本身; 定义有参构造函数,需要预留无参构造函数
self.name = name # 实例属性
def say(self): # 实例方法
print('Person.name',self.name)
Person.name = '李四' # 类属性修改
Person.__age # 私有类属性访问 类内部访问
Person.__work() # 私有方法访问 类内部访问
def __work(self):
pass
obj = Person()
obj.say()
# 正确示例
obj._Person__age # 私有类属性访问
# 错误示例
Person.__age # 私有类属性访问 类外部访问异常
Person.__work() # 私有方法访问 类外部访问异常
内置方法
类定义一些专用方法,这些方法丰富程序的功能,可用于不同的场景。
方法名 __ (方法名) __ | 描述 |
---|---|
init(self,...) | 构造函数 |
del(self) | 释放函数,在对象被删除之前调用 |
new(cls,...) | 实例的生成操作 |
str(self) | 在使用print函数时,自动调用 |
getitem(self,key) | 获取对象属性值 |
len(self) | 获取对象长度 |
cmp(self,other) | 比较两个对象 |
getattr(self,name) | 获取对象属性值 |
setattr(self,name,value) | 设置对象属性值 |
delattr(self,name) | 删除对象属性值 |
gt(self,other) | 大于比较 |
lt(self,other) | 小于比较 |
ge(self,other) | 大于等于比较 |
le(self,other) | 小于等于比较 |
eq(self,other) | 等于比较 |
call(self,...) | 把实例对象作为函数调用 obj = Person() obj() |
运算符重载
python中支持运算符重载,通过定义运算符方法,实现自定义运算符。
运算符 | 方法 __ (方法名) __ | 描述 |
---|---|---|
+ | add(self,other) | 加法运算 |
- | sub(self,other) | 减法运算 |
<,<=,==,!=,>=,> | lt,le,eq,ne,ge,gt | 比较运算 |
<<,>> | lshift,rshift | 位运算 |
,/,%,//,* | mul,truediv,mod,floordiv,pow | 乘法运算 |
&&,|,^ | and,or,xor | 位运算 |
python
class Person:
def __add__(self, other): # p1+p2 self=p1,other=p2
return self.age + other.age
p1 = Person()
p2 = Person()
p1+p2