Python 面向对象
1.理解面向对象
为了更好地理解面向对象,我们将面向对象和面向过程做一个简单的对比。以吃饭为例:
面向过程:买食材--处理食材--开火--炒菜--做饭--吃饭
面向对象:点外卖
面向过程就是分析出解决问题的步骤,然后一步步解决;面向对象关注的是结果,将编程当成是⼀个事物,对外界来说,事物是直接使⽤的,不⽤去管他内部的情况。⽽编程就是设置事物能够做什么事。
2.类和对象
类和对象是面向对象的两个基本的概念。
- 对象: 是由类创造出来的一个具体存在的,可以直接使用的。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。
在程序开发中,应该先有类,再有对象。
类可以理解是一个模板,通过它可以创建出无数个具体实例,也就是一个个对象。
举个简单的例子,手机和手机图纸,图纸可以看做类,图纸本身不能直接被我们使用,利用图纸生产出来的一部部手机才能使用。图纸可以看作是类,一部部手机可以看作是一个个对象。
3.面向对象的实现方法
3.1 类的定义
Python中类使用class关键字来实现,一个类通常包含3个部分:
- 类的名称:即类名,通常用大驼峰命名法;
- 类的属性:即这一类事物有哪些特征;
- 类的方法:即这一类事物有哪些行为,或者说能做些什么事,有些什么功能。
class 类名(): # 类名后的小括号不写也可以 代码
class Phone(): color = 'blue' # 类的属性 def call_someone(self): # 类的方法 print('可以打电话')
3.2 创建对象
对象就是类的实例,创建对象的过程叫实例化。
对象名 = 类名() # 注意一定不要省略小括号()
my_phone = Phone() print(my_phone.color) # blue my_phone.call_someone() # 可以打电话
3.3 self
class Phone(): def show_me(self): print(self) my_phone1 = Phone() my_phone2 = Phone() print(my_phone1) # <__main__.Phone object at 0x000002E91D7EA650> print(my_phone2) # <__main__.Phone object at 0x000002E91D7EA620> my_phone1.show_me() # <__main__.Phone object at 0x000002E91D7EA650> my_phone2.show_me() # <__main__.Phone object at 0x000002E91D7EA620>
3.4 添加和获取对象的属性
属性即是特征,比如:手机的长,宽,重量,颜色等:
对象属性既可以在类外面添加和获取,也能在类里面添加和获取。
class Phone(): color = 'red' def show_me(self): print(self.weight) # 在类里面获取属性 self.属性名 添加属性是 self.属性名 = 值 my_phone = Phone() my_phone.weight = 150 # 在类外面添加属性 对象名.属性名 = 值 print(my_phone.weight) # 150 在类外面获取属性 对象名.属性名 print(my_phone.color) # red my_phone.show_me() # 150
3.5 魔术方法
__init__(self):在创建一个对象时默认被调用,不需要手动调用。通常用于定义一个对象有哪些属性。self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。
__str__:返回对象的描述信息。该方法在print(对象)时,会被自动调用。
class Phone(): def __init__(self, kind, brand): self.kind = kind self.brand = brand def show_me(self): print(f"品牌:{self.brand} 类型:{self.kind}") def __str__(self): return f"{self.brand}牌的{self.kind}" # 返回值必须是字符串类型,否则会报错 my_phone1 = Phone('老式按键机', '菠萝') # __init__方法中除了self之外,有2个必备参数,创建对象时也要传入2个参数,否则会报错 my_phone2 = Phone('超级手机', '华人') my_phone1.show_me() # 品牌:菠萝 类型:老式按键机 my_phone2.show_me() # 品牌:华人 类型:超级手机 print(my_phone2) # 华人牌的超级手机
4.类属性和实例属性
4.1 类属性
类属性是在类中定义的属性(在类方法之外定义的)。
- 类属性和类是绑定的,该类的所有对象都可以访问,所有对象共享类属性。
- 类属性可以通过类名来访问,也可以通过实例名来访问。
- 类属性只能通过类对象修改,不能通过实例对象修改。
class Bike(): price = 666 my_bike = Bike() his_bike = Bike() print(my_bike.price) # 666 通过对象也就是实例访问类属性 print(his_bike.price) # 666 print(Bike.price) # 666 通过类名访问类属性 my_bike.price = 888 # 表示创建了一个实例属性,并不是对类属性进行修改 print(my_bike.price) # 888 前面代码创建了一个实例属性,此处是实例属性,并不是访问类属性 print(his_bike.price) # 666 通过对象访问类属性 print(Bike.price) # 666 通过类名访问类属性 Bike.price = 999 # 将类属性值修改为999 print(my_bike.price) # 888 前面代码创建了一个实例属性,此处是实例属性,并不是访问类属性 print(his_bike.price) # 999 通过对象访问类属性 print(Bike.price) # 999 通过类名访问类属性
4.2 实例属性
在任意类方法内部,以“self.变量名”的方式定义的属性都是示例属性。 但通常是将示例属性定义在__init__()方法内,因为__init__()方法在创建示例时会自动调用。
- 如果通过实例对象修改类属性,表示的是创建了一个实例属性。
- 实例属性不能通过类去访问。
class Bike(): def __init__(self): self.color = 'red' def show_info(self): self.useage = 'ride' my_bike = Bike() print(my_bike.color) #red # print(my_bike.useage) # 此处直接访问useage会报错,因为未调用show_info方法,my_bike对象还没有useage属性 # print(Bike.color) # 此处取消注释会报错,不能通过类名访问实例属性,Bike类也没有同名的类属性 my_bike.show_info() # 调用show_info方法,my_bike对象拥有useage属性 print(my_bike.useage) # ride 此时就可以访问useage属性
4.3 私有属性
Python中,通过两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
私有属性在该类的内部可以访问。
class Person(): base_skill = 'eat' __money = 666 def my_money(self): print(self.__money) tom = Person() print(tom.base_skill) # eat # print(tom.__money) # 会报错 AttributeError: 'Person' object has no attribute '__money' # print(Person.__money) # AttributeError: type object 'Person' has no attribute '__money' tom.my_money() # 666
浙公网安备 33010602011771号