Python基础:面向对象

一、理解面向对象

面向对象:对整个代码逻辑(包含数据、函数、逻辑)进行包装(专业术语:封装),最大程度提升代码复用,减少编码量

二、类和对象

2.1 理解类和对象

类:类是对一系列具有相同特征和行为的实物的统称,是一个抽象的概念,不是真实存在的事物。特征即是属性,行为即是方法。

对象:对象是由类创造出来的一个具体存在的,可以直接使用的。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。

在程序开发中,应该先有类,再有对象。

 

2.2 类和对象的关系

类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。类只有一个,而对象可以有很多个,不同对象之间属性可能会各不相同。

 

2.3 类的设计

在使用面向对象开发前,应该首先分析需求,确定一下,程序中需要包含哪些类。

通过需要设计一个类,需要满足以下三个要素:

  • 类的名称,这个事物的名字,满足大驼峰命名法
  • 类的属性:这类事物具有什么样的特征
  • 类的方法:这类事物具有什么样的行为

 

2.4 面向对象实现方法

class 类名():    # 注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯
  代码
class Plane():
    def fly(self):
    print('我会飞')

2.4.1 创建对象

对象也叫实例,创建对象的过程叫实例化。

语法:对象名 = 类名()

#创建对象
plane1 = Plane()
print(plane1)
plane1.fly()

2.4.2 self

self指的是调用该函数的对象

# 1.定义一个类
class plane():
  def fly(self):
    print('我会飞')
    print(self)
#2 实例化两个对象
plane1 = plane()
print(plane1)
plane2 = plane()
print(plane2)
# 3.调用实例方法
plane1.fly()
plane2.fly()

注意:打印对象和self得到的结果是一致的,都是当前内存中存储的地址

2.4.3 魔法方法

在python中, __xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数

__init__:对象被初始化时,会被自动调用,专门定义一个对象具有哪些属性的方法(重点,不需要掌握)

__str__:返回对象的描述信息,print函数输出使用,不加 __str__ 正常返回对象指向的内存地址。该方法在print(对象)时,会被自动调用。当针对对象做str类型转换时,也会自动调用。

def __str__(self):
    return f'{self.name},{self.age},{self.grade},{self.score}'

这里返回的必须是str类型,用其他类型会报错。

 

三、添加和获取对象属性

属性即是特征,比如:飞机的长,宽,重量:
对象属性既可以在类外面添加和获取,也能在类里面添加和获取。

3.1 类外面添加对象属性

语法

对象名.属性名 = 值

示例:

plane1.lenth = 400
plane1.weight = 500

3.2 类外面获取对象属性

语法

对象名.属性名

示例:

print(plane1.weight)
print(plane1.lenth)

3.3 类里面获取对象属性

self.属性名

 

四、类属性和实例属性

4.1 类属性

类属性的优点

  • 类的实例,记录的某项数据 始终保持一致时,则定义类属性。
  • 实例属性 要求每个对象为其单独开辟一份内存空间 来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。

4.1.1 设置和访问类属性

  • 类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有
  • 类属性可以使用类对象实例对象访问
class Dog(object):
  tooth = 10
 
wangcai =Dog()
xiaohei = Dog()
print(Dog.tooth)  # 10
print(wangcai.tooth) #10
print(xiaohei.tooth) # 10

4.1.2 修改类属性

类属性只能通过类对象修改,不能通过实例对象修改。

如果通过实例对象修改类属性,表示的是创建了一个实例属性。

class Dog(object):
  tooth = 10
wangcai = Dog()
xiaohei = Dog()
# 修改类属性
Dog.tooth = 20
print(Dog.tooth) # 20
print(wangcai.tooth) #20
print(xiaohei.tooth) # 20
# 修改实例属性
wangcai.tooth = 30
print(wangcai.tooth) #给实例对象增加一个实例属性 30
print(Dog.tooth) # 20
print(xiaohei.tooth) # 20

 

4.2 实例属性

实例属性不能通过类去访问。

class Dog(object):
  def __init__(self):
    self.age= 5
  def info_print(self):
    print(self.age)
wangcai = Dog()
print(wangcai.age)
# print(Dog.age) #报错,实例属性不能通过类去访问
wangcai.info_print() # 5

 

五、类方法和静态方法

5.1 类方法

5.1.1 类方法特点

  • 第一个形参是类对象的方法
  • 需要用装饰器 @classmethod 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls 作为第一个参数。cls表示当前类。
  • 注意:类方法无法直接使用self去调用对象属性和对象方法

 5.1.2 类方法使用场景

  • 当方法中 需要使用类对象(如访问私有属性等)时,定义类方法
  • 类方法一般和类属性配合使用
    class Student():
        school = '郑梁梅'
    @classmethod def show_school(cls): print(f'学校是{cls.school}')

    student1 = Student()
    result = student1.show_school #实例对象访问类方法
    Student.show_school   # 类对象访问类方法

5.2 静态方法

5.2.1 静态方法特点

  • 需要通过装饰器 @staticmethod 来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有 self 或者 cls )
  • 静态方法 也能通过实例对象和类对象去访问

5.2.2 静态方法使用场景

  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性,类方法,创建实例对象等)时,定义 静态方法
  • 取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
  • 仅仅是为了按照一定规则分类,把这个函数放在了类下面进行管理
class Dog(object):
  @staticmethod
  def info_print():
    print('这是一个狗类,用于创建狗的实例......')
   
wangcai = Dog()
#静态方法既可以使用对象访问又可以使用类访问
wangcai.info_print()
Dog.info_print()

 

六、继承

Python面向对象继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性的方法。

#父类A
class A(object):
  def __init__(self):
    self.money = "qq密码"
  def qq_info(self):
    print(self.money)
   
#子类B
class B(A):
  pass
son = B()
son.info_print()

在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

posted @ 2023-03-17 16:26  阳光倾林  阅读(112)  评论(0编辑  收藏  举报