对象Object ¶
约 845 个字 57 行代码 预计阅读时间 4 分钟
在创建模块化项目时,一个非常有用的实践是引入可能随时间改变状态的数据。
面向对象编程 (object-oriented programming) 的核心就是向数据添加状态
实际上,Python 中所有的值都是对象。也就是说,所有的值都有行为和属性,它们拥有它们所代表的数据的行为。
对象和类 ¶
对象三个要素
- 类(类型
) :int、 float 、bool 、string list 、tuple 、dict 、set - 对象举例: 
3,[5.7,’a’],{1:4,2:5} type()函数判断对象的类
- 类 (class): 定义属性 ( 数据 ) 和⾏为(⽅法)的模板
 - 实例 (instance):是⽤类产⽣的对象,
 
- 术语对象 (object) 和实例 (instance) 经常是可以互换的
 - 使⽤圆点运算符 (.) 引⽤⽅法和属性
 - 类有⾃⼰名字空间
 - 每个对象也有⾃⼰的名字空间
 
消息传递 ¶
什么是消息传递? 想象你有一部手机(对象):
你不用知道手机内部怎么工作的
- 你只需要按按钮(发消息
) ,手机就会做出响应 
- 按 " 拍照 " 按钮 → 手机执行拍照功能
 
- 按 " 音量 +" 按钮 → 手机调大音量
 
创建和使用 ¶
class <类名>:    
    initializer    
    methods
    
class Student:    #学⽣类:包含成员变量和成员方法
    def __init__(self,mname,mnumber): #构造方法
        self.name = mname    #成员变量
        self.number = mnumber
        self.Course_Grade = {} 
        self.GPA = 0
    def getInfo(self):    #成员方法
        print(self.name,self.number)
s1 = Student("wang","317000010")    #创建s1对象
s1.getInfo() 
Student.getInfo(s1)
s2=Student("zhang","317000011") #创建s2对象
s2.getInfo()
- 
__init__()__init__()⽅法是 Python 类中的⼀种特殊⽅法,⽅法名的开始和结束都是双下划线,该⽅法称为构造⽅法,当创建类的对象时,它被⾃动调⽤
__init__()⽅法中可以声明类所产⽣的对象属性,并可为其赋初始值。该⽅法有⼀个特点,不能有返回值,因为它是⽤来构造对象的,调⽤后实例化了⼀个该类型的对象
 
- 
self参数- 类的实例⽅法有⼀个名为
self的参数,并且必须是⽅法的第⼀个形参(如果有多个形参的话) ,self参数代表将来要创建的对象本身 
- 在类的⽅法中访问实例变量(数据成员)时需要以 self 为前缀
 
- 在外部通过对象调⽤对象⽅法时并不需要传递这个参数,如果在外部通过类调⽤对象⽅法则需要显式为
self参数传值 
 - 类的实例⽅法有⼀个名为
 
属性(attributes)¶
<expression> . <name>
方法(methods)¶
其实也是属性,只不过该属性的值是函数。对象知道如何执行这些方法。
数据共享和身份(Sharing and Identity)
最后两个比较说明了 is 和 == 的区别。前者是检验的是对象的内存地址,而后者只是判断内容是否相同。
- Python 类中成员:
- 数据成员(变量、属性)
 
 - 类数据成员
- 公有 - 内部:以两个下划线
__开头 - ⽅法(函数) - 实例⽅法: - 公有 - 私有 :⽅法名以两个下划线__开头 - 类⽅法 : @classmethod - 静态⽅法:@staticmethod - 在Python中,以下划线开头的⽅法名和变量名有特殊的含义,尤其是在类的定义中 
封装 ¶
- 将数据和对数据的操作组合起来构成类,类是⼀个不可分割的独⽴单位
 - 类中既要提供与外部联系的接⼝,同时⼜要尽可能隐藏类的实现细节。
 - Python 类中成员分为数据(变量、属性)成员和⽅法(函数)成员。
 
继承 ¶
多态 ¶
- 子类型多态(继承多态) 最常见的多态形式,通过继承实现:
 
class Animal:
    def speak(self):
        pass
class Dog(Animal):
    def speak(self):
        return "汪汪汪!"
class Cat(Animal):
    def speak(self):
        return "喵喵喵!"
# 多态体现
animals = [Dog(), Cat()]
for animal in animals:
    print(animal.speak())
# 输出:
# 汪汪汪!
# 喵喵喵!
- 鸭子类型多态(Python 特色) Python更推崇"鸭子类型"——如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子:
 
class Dog:
    def speak(self):
        return "汪汪汪!"
class Robot:
    def speak(self):
        return "我是机器人!"
# 不要求继承同一父类,只要有speak方法就行
things = [Dog(), Robot()]
for thing in things:
    print(thing.speak())
# 输出:
# 汪汪汪!
# 我是机器人!
len 作用在不同对象上,有不同的行为。
print(len("hello"))  # 字符串 → 5
print(len([1,2,3]))  # 列表 → 3
print(len({"a":1, "b":2}))  # 字典 → 2