Skip to content

类对象

每个 Python 类的定义都会隐式继承自 object 类,它的定义非常简单,几乎什么行为都不包括。我们可以创建一个 object 实例,但很多事情无法完成,因为很多特殊方法的调用程序都会抛出异常。

对于任何自定义类,都会隐式继承 object 。以下是一个类定义的示例(隐式继承了object 类)。

python
class Person:
    pass

下面是对自定义类进行交互的代码。

>>> X.__class__
<class 'type'>
>>> X.__class__.__base__
<class 'object'>

可以看到类定义就是对type 类的一个对象的类型声明,基类为object

相应地,派生自object 类中的对象方法也将继承各自相应的默认实现。在某些情况下,基类中一些特殊方法的默认行为也正是我们想要的。对于一些特殊情况,就需要重写这些方法。

类对象执行顺序

面向对象开发,最重要的是 抽象能力,也就是将现实世界中的事物抽象为逻辑转化为代码的能力。

面向对象的开发顺序:

  1. 第 1 步是设计类对象
  2. 使用 类名() 创建对象,创建对象时,背后会自动执行以下两个步骤:
    1. 在内存中为对象分配空间
    2. 调用初始化方法 __init__ 为 对象初始化
  3. 对象创建后,内存中就有了一个对象的实实在在的存在 —— 实例对象

因此,通常也会把:

  1. 创建出来的对象叫做 类的实例, 也称之为 类的实例对象, 简称 实例对象
  2. 创建对象的动作叫做 实例化
  3. 对象的属性叫做 实例属性
  4. 对象调用的方法叫做 实例方法

在程序执行时:

  1. 对象各自拥有自己的 实例属性
  2. 实例对象内部调用,可以通过 self.
    • 访问自己的属性
    • 调用自己的方法
  3. 实例对象外部调用,可以通过 实例对象名.
    • 访问自己的属性
    • 调用自己的方法 每一个对象都有自己独立的内存空间,保存各自不同的属性

类对象封装的实例方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部。而实例属性,每个都是独立存在的。

类是特殊的对象

注意

Python 中一切皆对象:

  • class AAA: 定义的类属于类对象
  • obj1 = AAA() 属于实例对象

在程序运行时,类同样会被加载到内存。 在 Python 中,类是一个特殊的对象 —— 类对象

在程序运行时,类对象在内存中只有一份,使用 一个类对象可以创建出很多个对象实例

  • 除了封装的属性和方法外,类对象还可以拥有自己的属性和方法
    1. 类属性
    2. 类方法
  • 通过 类名. 的方式可以访问类的属性或者调用类的方法

类属性

  • 类属性 就是给 类对象 中定义的属性,所有实例对象共享。
  • 通常用来记录与这个类相关的特征,例如:人类的定居地地球。
  • 类属性 不会用于记录 具体对象(实例对象)的特征

示例

定义一个 Hero 类对象 类对象有 class_name 类名

python
class Person:
    address = '地球'  # 类属性 直接定义在类里面  

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def hello(self):
        return f'{self.name} 正在打招呼'

print(Person.address) 
zx = Person('正心', 18)
print(zx.address)
zx.address = '外太空'
print(zx.address)

类方法

类方法就是针对类对象定义的方法

  • 类方法 内部可以直接访问 类属性 或者调用其他的 类方法

语法如下

python
class Person:

    @classmethod  # 类方法装饰器
    def 类方法名(cls):
        pass
  • 类方法 需要用 修饰器 @classmethod 来标识,告诉解释器这是一个类方法
  • 类方法 的第一个参数应该是 cls 。使用其他名称也可以,不过习惯使用 cls
    • 由哪一个类调用的方法,方法内的 cls 就是哪一个类的引用。与实例方法的第一个参数是 self 类似。
  • 通过 类名. 调用类方法,调用方法时,不需要传递 cls 参数
  • 在方法内部
    • 可以通过 cls. 访问类的属性
    • 也可以通过 cls. 调用其他的类方法

静态方法(了解)

在开发时,如果需要在类中封装一个方法,这个方法:

  • 既不需要访问实例属性或者调用实例方法
  • 也不需要访问类属性或者调用类方法

这个时候,可以把这个方法封装成一个静态方法

语法如下

python
class Example:

    @staticmethod
    def func():
        pass
  • 静态方法需要用修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法
  • 通过 类名. 调用静态方法

私有属性方法(了解)

在使用面向对象编程时,没有编程语言会暴露出所有设计的细节。对于 Python 也是如此,可以用私有变量将一部分内容不暴露出去。

Python 的内部命名以 __ 起始,表示为 私有变量 。这也是 Python 避免内部和外部应用程序发生冲突的方式。

应用场景

  • 在实际开发中,实例对象的 某些属性或方法只希望在实例对象的内部被使用,而不希望在外部被访问到 。
  • 私有属性 就是 实例对象 不希望公开的属性
  • 私有方法 就是 实例对象 不希望公开的方法

定义方式

在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法

python
class Women(object):

    def __init__(self, name, high, age):
        self.name = name
        self.high = high
        # 双下划线 私有属性 外部无法调用
        self.__age = age

    def __fly(self):
        return self.__age

    def __secret(self):
        print("我的年龄是 %d" % self.__age)


fang = Women("小芳")
# 私有属性,外部不能直接访问
# print(fang.__age)

# 私有方法,外部不能直接调用
# xiaofang.__secret()