1 基本理论
1.1 对象
python 是一门特别彻底的面向对象编程(oop)的语言
其他语言会分为基本数据类型,和对象类型 (如 Objective-C)。
而 python 则全部都是对象类型,包括 int float等
1.2 面向过程、面向对象
两者都是解决方法的思想
面向过程:在解决问题的时候,关注的是解决问题的每一个过程(步骤)
面向对象:在解决问题的时候,关注的是解决问题所需要的对象
面向对象本身是面向过程的封装
面向过程,关注的是:功能步骤的划分
面向对象,关注的是:功能步骤封装
1.3 类
类指的是某一个具体对象特征的抽象
类的作用:根据抽象类,生产具体的对象
python 中类的定义
# 定义类
class Person:
pass
# 实例化 Person
man = Person()
print(man)
# 对比函数的定义
def sum():
pass
pycharm 小技巧:
快速输入 print(man),可以通过先敲 man.pri + tab键自动补全后则会变成前面的打印语句
2 类与对象关系
# 定义一个类
class Money:
pass
#查看类的命名 (__name__ 是 class 的属性)
print(Money.__name__)
# xxx = Money
# print(xxx.__name__)
# 类名同时也是一个变量
Money = 666
print(Money) # 结果就是666
# # 根据这个类, 创建(实例化)一个对象
one = Money()
print(one) # 是一个 objc
print(one.__class__) # 打印出 Money 类
对象与类的关系
3 对象属性操作
给对象添加属性
# 1. 定义一个类
class Person:
pass
# 2. 根据类, 创建一个对象
p= Person()
# 3. 给p对象, 增加一些属性
p.age = 18
p.height = 180
# 4. 验证是否有添加成功
print(p.age)
删除对象属性,通过删除语句
del p.age
查看该实例所有属性
print(p.__dict__)
修改对象属性
p.age = 100
给实例添加可变属性及修改属性
p.pets = ["小花", "小黑"]
print(p.pets, id(p.pets))
p.pets.append("小黄")
print(p.pets, id(p.pets))
# 属性值改变后 id 不变
查看对象属性
print(p.age)
同一类下的不同对象,不能互相访问属性,即
p1 = Person()
p2 = Person()
p1.age = 18
p2.address = "上海"
print(p1.address) # 报 error,说 p1没有address属性
4 类属性操作
类的本质也是一个对象,一般称为类对象,那么类同样也具有对象属性的性质
给类增加属性1 - 通过 类名.属性方式
class Money:
pass
Money.count = 1
Money.age = 18
print(Money.count)
# 查看类的所有属性
print(Money.__dict__)
给类增加属性2 - 在类代码体内添加
class Money:
age = 18
count = 1
print(Money.age)
print(Money.count)
print(Money.__dict__)
类属性访问
#方式一:通过类名直接访问
Money.age
#方式二:通过实例对象访问类属性
class Money:
age = 18
one = Money()
print(one.age)
类属性修改
# 只能通过类名修改
Money.age = 100
# 如果“通过实例修改类属性”,并不影响类属性,同时实例会增加一个 age 属性
one.age = 19
print(Money.age)
print(one.__dict__) # 打印结果不包含类的属性
python 对象属性的查找机制
1.优先到对象自身去查找属性,找到结束
2.没找到,则通过class找到对应的类,然后在该类里查找
对象的__class__属性是可以被动态修改。
one.__class__ = Test
删除类属性
del Money.age
# 不能通过对象删除,del 语句只能删除直系属性
注意
1. 只能通过类名进行的类属性操作:增、删、改
可以通过类名和实例对象进行的类属性操作:查
2. 类属性的内存存储问题
- 一般情况下,属性存储在__dict__的字典当中,有些内置对象没有__dict__属性
- 一般对象可以直接修改__dict__属性
- 但类对象的__dict__为只读:默认无法修改,可以通过 seattr 方法修改
3. 类属性被各个对象共享
限制对象属性的添加 __slots__
# 一般情况下,实例对象可以通过 实例.属性名 方式动态添加无限个实例属性,
# 这种能力有时候会对抽象类造成污染,或者希望该类产生的实例只能添加指定名称属性时
# 就可以通过类属性 __slots__ 来限制对象添加属性
class Person:
__slots__ = ["age"]
pass
p1 = Person()
p1.age = 1
p1.num = 2 #报错,Person object 没有 num 属性