Python Class 详解
1、基本概念
1.1 类 class
- 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。
- 用计算机的语言描述类,是属性和方法的集合。
1.2 对象 instance / object
- 对象是类的具象,是一个实体。
- 对于我们每个人这个个体,都是抽象概念人类的不同的实体。
- 对象属性:它是对象状态的抽象,用数据结构来描述
- 对象操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述
1.3 面向对象三要素
-
1 封装
组装:将数据和操作组装到一起
隐藏数据:对外只暴露一些接口,通过接口访问对象 -
2 继承
多复用,继承来的就不用自己写了
多继承少修改,OCP(open-closed principle),使用继承来改变,来体现个性 -
3 多态
面向对象编程最灵活的地方,动态绑定
1.4 哲学思想
- 一切皆对象
- 对象是数据和操作的封装
- 对象是独立的,但是对象之间可以相互作用
- 目前 OOP(Object-oriented programming) 是最接近人类认知的编程范式
2、类
2.1 类的定义
- 1 必须使用 class 关键字
- 2 类名必须是用 大驼峰 命名
- 3 类定义完成后,就产生了一个类对象,绑定到了标识符 ClassName 上
class ClassName:
语句块
2.2 类对象及类属性
- 1 类对象,类的定义执行后会生成一个类对象
- 2 类的属性,类定义中的变量和类中定义的方法都是类的属性
- 3 类变量,直接定义再类中的属性;一般来讲,类变量可使用全大写来命名
2.3 类的实例化
- 1 在类对象名称后面加上一个括号,就是调用类的实例化方法,完成实例化
- 2 实例化就是真正的创建一个该类的对象(实例)
- 3 每次实例化后获得的实例,都是不同的实例
- 4 即使是使用同样的参数实例化,也得到不一样的对象
- 5
Python
类实例化后,会自动调用__init__
方法,这个方法的第一个形式参数必须留给self
,其它参数随意
2.4 __init__
方法
- 1 类的实例化,实际上就是调用的
__init__(self)
方法 - 2 这个方法可以不定义,如果没有定义会在实例化后隐式调用
- 3 作用:对实例进行初始化
- 4 初始化参数可以多个参数,但是第一个位置必须是
self
- 5 此方法不能有返回值,也就是只能
return None
- 6 实例化调用
__init__
魔术方法来进行初始化-出厂配置,对生成的实例进行属性配置,__init__
定义的是实例的属性
2.5 实例对象 instance
- 1 类实例化后一定会获得一个类的实例,就是 实例对象
- 2
__init__
方法的第一参数 self 就是指代某一个实例自身 - 3 类实例化后,得到一个实例对象,调用类方法时,采用
instance.class_method()
的方式,实例对象就会绑定到方法上 - 4 调用类方法时,类方法的
self
参数,就是 实例自身 - 5
__init__
中所定义的变量,是保存在 实例 上的,并不是 类 上,所以,称为 实例变量 - 6 实例变量是每一个实例自己的变量,是自己独有的
- 5 类变量是类的变量,是类的所有实例共享的属性和方法
2.6 示例 1
class MyClass:
"""My first class"""
print('in class')
xx = 'abc' # 类的属性
def __init__(self, x, y):
print('in init')
self.x = x
self.y = y
def foo(self):
print('in foo')
return "My class"
print(MyClass.xx, MyClass.foo, MyClass.__doc__)
myc1 = MyClass(1, 2)
myc1 = MyClass(1, 2)
print(myc1.foo())
print(MyClass.foo(myc1))
# 上例中 xx 和 foo 都是类的属性,__doc__ 也是类的特殊属性
# foo 是 方法method,本质上就是普通函数对象 function
# 第一个形式参数 self,指代当前实例本身
in class
abc <function MyClass.foo at 0x000002A221E76F70> My first class
in init
in init
in foo
My class
in foo
My class
2.7 示例 2
# self
class MyClass:
def __init__(self):
print(1, 'self in init = {}'.format(id(self)))
def showself(self):
print(2, 'self in showself() = {}'.format(id(self)))
c = MyClass()
print('After instance c')
print(3, 'c = {}'.format(id(c)))
print('=' * 30)
c.showself()
print(MyClass.showself)
print(c.showself)
# 类实例化后,得到一个实例对象,调用类方法时,采用 instance.class_method() 的方式,实例对象就会绑定到方法
# self 就是调用者,self 这个名字只是一个惯例,可以修改,但最好不要修改
# 查看打印结果,思考一下代码的执行顺序
1 self in init = 2895381183888
After instance c
3 c = 2895381183888
==============================
2 self in showself() = 2895381183888
<function MyClass.showself at 0x000002A221D851F0>
<bound method MyClass.showself of <__main__.MyClass object at 0x000002A2222ABD90>>
2.8 示例 3
# 实例变量和类变量
# 实例变量是每一个实例自己的变量,是自己独有的
# 类变量是类的变量,是类的所有实例共享的属性和方法
class Person:
age = 3
def __init__(self, name):
self.name = name
tom = Person('Tom')
jerry = Person('Jerry')
print(tom.name, jerry.name)
print(tom.age, jerry.age)
print(Person.age)
Person.age = 30
print(Person.age, tom.age, jerry.age)
Tom Jerry
3 3
3
30 30 30
3、对象属性
3.1属性介绍
-
1 特殊属性
__name__ __class__ __dict__ __qualname__
-
2
Python
中每一种对象都拥有不同的属性 -
3 函数、类都是对象,类的实例也是对象
-
4 类属性保存在类的
__dict__
中,实例属性保存在实例的__dict__
中 -
5 属性是类的,也是这个类所有实例的,其它实例都可以访问到
-
6 属性是实例的,就是这个实例自己的,通过类访问不到
-
7 对象(实例或类)可以动态的给自己增加一个属性(赋值即定义一个新属性)
-
8
实例.__dict__[变量名]
和