「Python」 类
前导知识:(懂程序设计基础,面向对象程序设计更好)
类(class)封装了一组相关数据,并提供一系列方法对其维护;
类之间的关系有继承(inhertiance,is-a)和组合(composition,has-a);
类和模块的区别:类可以生成多个实例;类可被继承和扩展;类实例的生命周期可控;类支持运算符,可按需重载;
没有意义的比较;也就是能帮助小白理解什么是类吧;不过如果是面试官问出这种问题,一时间,可能真的要卡住了;
建议将类与业务逻辑分离;业务逻辑与函数的概念更为吻合——过程化、无状态及用上下文传递数据;而类是以数据为中心,注重遗传,满足多实例需求;
一、 定义类
- 创建:使用 class 关键字定义类;
- 名字空间:类都有自己的名字空间;子类本身并不包括父类中的成员,需调用父类初始化方法 supper().init() 方法来引用父类类型(不是复制);
- 继承:当通过实例或类型访问某个成员时,会从当前对象开始;依次由近及远(从子类到祖先类)查找,按顺序优先命中;祖先的成员会广播给后代;
除了类成员
二、 成员
官方文档写作 Attribute,也译作字段;
成员分为类成员和实例成员;类成员在 class 语句块内直接定义,而实力成员需通过实例引用(self)赋值定义;
三、 属性
四、 方法
五、 继承
六、 开放类
附录
A 知识点
1. 创建类
创建类:
class Demo:
pass
注意:放在函数内定义的类,每次调用函数都是新建,虽然名字和内容相同,但是也属于不同的类型;
def test():
class Demo:
pass
return Demo()
a, b = test(), test()
print(a.__class__ is b.__class__) # False
2. 名字空间
class A:
a = 100 # 类成员变量
def __init__(self, p): # 实例初始化
self.x = p # 实例成员变量
def get_x(self): # 实例方法
return self.x
class B(A): # 继承自 A
b = "hello"
def __init__(self, p, q):
super().__init__(p) # 调用父类初始化方法
self.y = q
def get_y(self):
return self.y
c = B(2, 3)
print("A:\n", A.__dict__) # 类 A 的名字空间字典,不可直接修改
print("B:\n", B.__dict__) # 类 B 的名字空间字典,不可直接修改
print("object c:\n", c.__dict__) # 实例 c 的名字空间字典,可直接修改
print("dir(object c):\n", dir(c)) # 所有可访问的成员的名字
print("vars(object c):\n", vars(c)) # 和 __dict__ 功能一样
输出:
A:
{'a': 100, '__init__': <function A.__init__>, 'get_x': <function A.get_x>, ...}
B:
{'b': 'hello', '__init__': <function B.__init__>, 'get_y': <function B.get_y>, ...}
object c:
{'x': 2, 'y': 3}
dir(object c):
['a', 'b', 'get_x', 'get_y', 'x', 'y', ...]
vars(object c):
{'x': 2, 'y': 3}
3. self
- self 参数总是指向当前的实例;
- 其中 self 只是约定俗成的名字,也可以换用其他字符来代替;
- 继承关系中,子类成员会覆盖父类成员;
示例:
class A:
a = 100 # 类成员变量
def __init__(self, p): # 实例初始化
self.x = p # 实例成员变量
def get_x(self): # 实例方法
return self.x
参考资料
- Python3 面向对象[EB/OL]. http://www.runoob.com/python3/python3-class.html. -/2019-01-11
Comments