您的当前位置:首页正文

Python基础15-面向对象(类/对象/属性)

来源:华拓网

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