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

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

self 表示类的实例。通过类创建对象时,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 魔术方法

在Python中,__ xx__() 的函数叫做魔法⽅法,指的是具有特殊功能的函数。本文先介绍如下2个魔术方法。

__init__(self):在创建一个对象时默认被调用,不需要手动调用。通常用于定义一个对象有哪些属性。self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。

__str__:返回对象的描述信息。当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 str ⽅法,那么就会打印从在这个⽅法中 return 的数据。该方法在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

 

posted on 2023-04-06 18:35  木去  阅读(131)  评论(0)    收藏  举报