类对象
每个 Python 类的定义都会隐式继承自 object
类,它的定义非常简单,几乎什么行为都不包括。我们可以创建一个 object
实例,但很多事情无法完成,因为很多特殊方法的调用程序都会抛出异常。
对于任何自定义类,都会隐式继承 object
。以下是一个类定义的示例(隐式继承了object
类)。
class Person:
pass
下面是对自定义类进行交互的代码。
>>> X.__class__
<class 'type'>
>>> X.__class__.__base__
<class 'object'>
可以看到类定义就是对type
类的一个对象的类型声明,基类为object
。
相应地,派生自object
类中的对象方法也将继承各自相应的默认实现。在某些情况下,基类中一些特殊方法的默认行为也正是我们想要的。对于一些特殊情况,就需要重写这些方法。
类对象执行顺序
面向对象开发,最重要的是 抽象能力
,也就是将现实世界中的事物抽象为逻辑转化为代码的能力。
面向对象的开发顺序:
- 第 1 步是设计类对象
- 使用
类名()
创建对象,创建对象时,背后会自动执行以下两个步骤:- 在内存中为对象分配空间
- 调用初始化方法
__init__
为 对象初始化
- 对象创建后,内存中就有了一个对象的实实在在的存在 —— 实例对象
因此,通常也会把:
- 创建出来的对象叫做
类的实例
, 也称之为类的实例对象
, 简称实例对象
- 创建对象的动作叫做
实例化
- 对象的属性叫做
实例属性
- 对象调用的方法叫做
实例方法
在程序执行时:
- 对象各自拥有自己的
实例属性
- 实例对象内部调用,可以通过
self.
- 访问自己的属性
- 调用自己的方法
- 实例对象外部调用,可以通过
实例对象名.
- 访问自己的属性
- 调用自己的方法 每一个对象都有自己独立的内存空间,保存各自不同的属性
类对象封装的实例方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部。而实例属性,每个都是独立存在的。
类是特殊的对象
注意
Python 中一切皆对象:
class AAA:
定义的类属于类对象obj1 = AAA()
属于实例对象
在程序运行时,类同样会被加载到内存。 在 Python
中,类是一个特殊的对象 —— 类对象
在程序运行时,类对象在内存中只有一份,使用 一个类对象可以创建出很多个对象实例
- 除了封装的属性和方法外,类对象还可以拥有自己的属性和方法
- 类属性
- 类方法
- 通过
类名.
的方式可以访问类的属性或者调用类的方法
类属性
类属性
就是给类对象
中定义的属性,所有实例对象共享。- 通常用来记录与这个类相关的特征,例如:人类的定居地地球。
类属性
不会用于记录具体对象(实例对象)的特征
。
示例
定义一个 Hero 类对象 类对象有 class_name
类名
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)
类方法
类方法就是针对类对象定义的方法
- 在
类方法
内部可以直接访问类属性
或者调用其他的类方法
语法如下
class Person:
@classmethod # 类方法装饰器
def 类方法名(cls):
pass
类方法
需要用 修饰器@classmethod
来标识,告诉解释器这是一个类方法类方法
的第一个参数应该是cls
。使用其他名称也可以,不过习惯使用cls
。- 由哪一个类调用的方法,方法内的
cls
就是哪一个类的引用。与实例方法的第一个参数是self
类似。
- 由哪一个类调用的方法,方法内的
- 通过
类名.
调用类方法,调用方法时,不需要传递cls
参数 - 在方法内部
- 可以通过
cls.
访问类的属性 - 也可以通过
cls.
调用其他的类方法
- 可以通过
静态方法(了解)
在开发时,如果需要在类中封装一个方法,这个方法:
- 既不需要访问实例属性或者调用实例方法
- 也不需要访问类属性或者调用类方法
这个时候,可以把这个方法封装成一个静态方法
语法如下
class Example:
@staticmethod
def func():
pass
- 静态方法需要用修饰器
@staticmethod
来标识,告诉解释器这是一个静态方法 - 通过
类名.
调用静态方法
私有属性方法(了解)
在使用面向对象编程时,没有编程语言会暴露出所有设计的细节。对于 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()