python面向对象 Object Oriented
类和对象
实例成员
- 实例变量
作用:描述所有对象的共有数据
说明:通常在构造函数
__init__中创建
__dict__:用于存储自身实例变量的字典
特殊的:可在外部定义(一般用不到) - 实例方法
作用:表示对象行为
说明:至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为”self”
无论创建多少对象,方法只有一份,并且被所有对象共享
不建议通过类名访问实例方法(要传入实例)
类成员
- 类变量
作用:描述所有对象的共有数据
说明:只有一份,被所有对象共享
不建议通过对象访问类变量 - 类方法
作用:操作类变量
说明:至少有一个形参,第一个形参用于绑定类,一般命名为’cls’
使用@classmethod修饰的目的是调用类方法时可以隐式传递类
类方法中不能访问实例成员,实例方法中可以访问类成员
不建议通过对象访问类方法 - 静态方法
作用:一般用来定义常用的工具函数
说明:使用@ staticmethod修饰的目的是该方法不需要隐式传参数
静态方法不能访问实例成员和类成员
不建议通过对象访问静态方法
封装
- 私有成员
作用:无需向类外提供的成员,可以通过私有化进行屏蔽
说明:障眼法,实际也可以访问
私有成员的名称被修改为:_类名__成员名,可以通过_dict_属性或dir函数 __slots__
作用:限定一个类创建的实例只能有固定的实例变量,不能再额外添加
说明:含有__slots__属性的类所创建的对象没有__dict__属性, 即此实例不用字典来存储对象的实例属性
对继承的子类不起作用- 属性@property
作用:方便操作私有变量
说明:@property 负责读取
@属性名.setter 负责写入
方法中可自行加入逻辑
继承与多态
注意要点:
父类某方法中加入
raise NotImplementedError(),则子类必须重写这个方法方法在子类中未找到时,从左到右查找父类中是否包含方法
isinstance() 用于检查实例类型;issubclass() 用于检查类继承
def __str__(self):将对象转换为字符串(对人友好的)def __repr__(self):将对象转换为字符串(解释器可识别的)
附
class MyClass:
a = 1 # 类变量,只有一份,所有对象共享
def __init__(self):
self.a = 3 # 实例变量
self.b = 4 # 每次实例化就创建一次
@property
def b(self):
# 读取或格式化保护数据,可以加读取条件
return self.__b
# 如果b为可变对象,可以考虑切片
# return self.__b[:]
@b.setter
def b(self, value):
# 写入或格式化保护数据,可以加写入条件
self.__b = value
def __str__(self):
# __str__默认调用__repr__,返回实例信息
return '__str__返回 ' + str(self.a)
def test_method(self):
print('test_method', self.a)
self.__private_method() # 调用私有方法
def __private_method(self):
print('private_method', self.a)
@staticmethod
def static_method():
# 静态方法无法访问类成员和实例成员
# 只能通过类名访问,但这样会造成硬编码,不推荐
print('static_method', MyClass.a)
@classmethod
def class_method(cls):
# 类方法可以访问类成员,无法访问实例成员
print('class_method', cls.a)
if __name__ == '__main__':
test = MyClass()
# 打印实例对象时调用__str__
print(test)
# __dict__只能获取自身成员
print(MyClass.__dict__)
print(test.__dict__)
# 读写实例的成员变量
test.b = 5
print(test.b)
# 只有类内部才能访问私有方法
# test.__private_method()
test.test_method()
# 调用类方法和静态方法时无需实例化
test.class_method()
test.static_method()
文档信息
- 本文作者:Weikang Yu
- 本文链接:https://AccelYu.github.io/2020/03/12/object/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)