第8天 | 12天搞定Python,面向对象


第8天 | 12天搞定Python,面向对象文章插图
国内有一档很火的相亲节目 , 不知你看过没?相亲环节大概是这样的:台上站着一排美女 , 每个美女面前都有一个唯一编号(如NO.1) 。 一男的从电梯里出来 , 然后面向1至11号美女对象 , 面向对象 。 然后男的经过一番秀(背景秀、才艺秀、印象秀等)之后 , 美女用按灯的方法 , 决定男的去留 。
不知你注意到没 , 相亲的人 , 是同一类人 , 都是未婚的人 , 都是光棍 , 都是单身狗 。
在面向对象编程语言(C++、Java、C#、Python等)中 , 就是把相同性质(都是单身狗)的事物归成一类 , 再从类中实例化到那个对象(如:1号美女) , 美其名曰面向对象编程 。
面向对象 , 让零散的函数成为整体 , 它将现实世界的事物抽象成对象 , 描叙其在整个解决问题的步骤中的行为 , 贴近现实生活中对事物的描述 , 更有利于人们对复杂系统进行分析、设计和编程 。
8.1 类和对象面向对象中 , 类和对象是两个非常重要的角色 。 类是对具有相同特性和行为的对象的抽象 , 如单身狗 。 在Python语言中 , 类使用class关键字+类名+冒号:结尾的方式创建 。 类名用大写字母开头 。 类的实例化(具体化)就是对象 , 如1号美女 。
# 定义单身狗类class SingleDog:def __init__(self, num):self.num = num# 按下灯def push(self):print("%d号美女灭灯" % self.num)return True# 对象1:1号美女singleDog = SingleDog(1)singleDog.push()# 对象2:2号美女singleDog = SingleDog(2)singleDog.push()【第8天 | 12天搞定Python,面向对象】输出结果
1号美女灭灯2号美女灭灯不知你明白了 , 单身狗程序员 。
8.2 实例方法在类里 , 定义方法时 , 如果第一个参数是self , 表示这个方法为实例方法 。 实例方法 , 只能通过对象和.的方式进行调用 。
以__init__命名的方法 , 是类的构造方法 , 它有且只能有一个 , 默认为:__init__() 。
有构造就有析构 , 析构方法是以__del__命名的 。 默认为:__del__() , 它经常用来释放资源 , 如断开数据库连接 。
# 定义一个类class Product:# 产品编号num = 168168# 构造方法def __init__(self):print("创建时调用")# 实例方法def get_num(self):return self.num# 析构方法def __del__(self):print("销毁时调用")# 实例化并调用方法p = Product()print(p.get_num())输出结果
创建时调用168168销毁时调用8.3 静态方法静态方法 , 通过类名和.直接调用 , 不需要创建对象 。 方法里 , 不用self参数 。 用@staticmethod装饰器声明 。 当然 , 用实例对象也是可以调用的 。
# 定义一个订单类class Order:# 静态方法@staticmethoddef get_title():return "好大一个单"# 实例化并调用方法order = Order()print(order.get_title())# 直接用类名调用print(Order.get_title())输出结果
好大一个单好大一个单8.4 类方法类方法 , 在Python中使用较少 , 类方法传入的第一个参数为cls , 是类本身 。 类方法可以通过类名或实例名调用 。 类方法@classmethod装饰器和cls参数声明 。
# 定义一个客户类class Customer:# 类方法@classmethoddef get_name(cls):return "西门吹水"# 实例化并调用方法c = Customer()print(c.get_name())# 直接用类名调用print(Customer.get_name())输出结果
西门吹水西门吹水8.5 方法总结实例方法第一个参数永远是self , 类方法第一个参数永远是 cls , 而静态方法没有任何必选参数 。
静态方法不会访问到class 本身, 它只是一个函数 , 没有访问对象和它的内部(属性和其他方法) , 而实例方法会访问self , 类方法会访问 cls 。
实例方法只能被实例对象访问 。 而静态方法、类方法既可被类访问 , 也可以被实例对象访问 。
# 类里的各种方法class Employee:# 构造方法def __init__(self, name, address):self.name = nameself.address = address# 实例方法def get_address(self):return self.address# 静态方法@staticmethoddef get_name():return "西门吹水"# 类方法@classmethoddef get_age(cls):return 38# 析构方法def __del__(self):print("释放资源")# 实例化c = Employee("程序员", "今日头条:老陈说编程")# 静态方法print(Employee.get_name())# 实力方法print(c.get_address())# 直接用类名调用print(Employee.get_age())输出方法
西门吹水今日头条:老陈说编程388.6 数据封装数据封装是面向对象编程的一个重要特点 , 它通过限制访问 , 对数据进行保护 。 封装 , 即是在类内部 , 将某些不想被外部访问或调用的部分内容隐藏起来 , 如若外部要调用 , 只能通过公开的接口进行 。 Python语言没有private、protected这些关键字, 它用双下划线__表示私有类型(private)的属性或方法 。 以单下划线_开头的表示的是protected 类型的属性和方法 。