Python Class 详解
- 1、基本概念
* - 1.1 类
class
- 1.2 对象
instance / object
- 1.3 面向对象三要素
- 1.4 哲学思想
- 2、类
* - 2.1 类的定义
- 2.2 类对象及类属性
- 2.3 类的实例化
- 2.4
__init__
方法 - 2.5 实例对象
instance
- 2.6 示例 1
- 2.7 示例 2
- 2.8 示例 3
- 3、对象属性
* - 3.1属性介绍
- 3.2 实例属性的查找顺序
- 3.3 示例 1
- 3.4 示例 2
- 3.5 示例 3
- 4、类方法 和 静态方法
* - 4.1 类方法
- 4.2 静态方法
- 4.3 总结
- 4.4 示例 1
- 5、访问控制
* - 5.1 示例 1
- 5.2 示例 2
- 6、属性装饰器
* - 6.1 示例 1
- 6.2 示例 2
- 7、对象的销毁
- 8、
__init__
与__del__
* - 8.1 示例 1
- 8.2 示例 2
- 9、
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))
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
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)
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__[变量名]
和实例.变量名
都可以访问到实例自己的属性(注意这两种访问是有本质区别的) - 9 实例的同名变量会隐藏掉类变量,或者说是覆盖了这个类变量,但是注意类变量还在那里,并没有真正的被覆盖
- 10 类方法(也是类属性)在定义时,第一个参数必须时
self
,而self
必须指向一个对象,也就是类实例化之后,由实例来调用这个方法
class Person:
pass
Person.__name__
Person.__class__.__name__, type(Person).__name__
type(Person), Person.__class__
3.2 实例属性的查找顺序
- 1 实例使用
.点号
来访问属性,会先找自己的__dict__
,如果没有,再通过属性__class__
找到自己的类,再去类的__dict__
中找 - 2 如果实例使用
__dict__[变量名]
来访问变量,就不会按照上面的查找顺序找变量了,这是指明使用字典的key
查找,不是属性查找
3.3 示例 1
class Person:
age = 3
def __init__(self, name):
self.name = name
print('----- class -----')
print(Person.__class__, type(Person))
print(sorted(Person.__dict__.items()))
print('=' * 66)
tom = Person('Tom')
print(tom.__class__, type(tom))
print(sorted(tom.__dict__.items()))
print('=' * 66)
print(tom.__class__.__name__)
print(sorted(tom.__class__.__dict__.items()))
print(sorted(type(tom).__dict__.items()))
Original: https://blog.csdn.net/weixin_44983653/article/details/123912636
Author: Lee木木
Title: Python Class 详解
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/727968/
转载文章受原作者版权保护。转载请注明原作者出处!