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 属性