Python 类的基本定义详解

概要: Python是一种面向对象的语言,稍微复杂一点的程序,都应该采用类来进行设计,以使程序结构更加清晰,易于把控

一. 成员的访问范围:

Python中的类,其实就是执行代码块,这一点很重要,所有位于 class 语句中的代码,都是在特殊的类命名空间中执行的,这个类命名空间可由类内所有实例成员访问。

类内成员包括类成员(用类名来访问),实例成员(用self 或 实例对象变量来访问)。

Python语言本身对成员的访问范围控制不是很严格,更是一种对程序员的提醒或约定,请不要在外部使用保护成员及私有成员。以下是实例成员的访问范围的定义约定;如果是类成员,应该都是公用的,否则,请不要把它定义为类成员。

类型 名称 python 中的定义方法 举例 可访问范围
public 公用成员 不加入任何特殊字符 member 类实例,继承类,当前类内部
protected 保护成员 加一个下划线 _member 继承类,当前类内部
private 私有成员 加二个下划线 __member 当前类内部

 

 

二. 类成员的定义详解

成员名称 说明 举例
类本身 类名的命名规范为 CamelCase 每个单词都以大写字母开头,单词之间没有分隔符 class DemoClass
构造函数 创建类实例时,将触发执行 def __init__(self):
析构函数 由系统的垃圾回收机制来自动执行,程序无法控制它何时执行,请谨慎使用 def __del__(self):
类代码 直接定义在类范围,不定义在任何方法中触发执行:第一次实例化对象,或第一次调用类成员 class DemoClass:     print(‘Class 执行代码块开始执行了, 但整个过程只执行一次!’)
类字段(类特性)   直接定义在类范围,不定义在任何方法内访问方法: DemoClass.class_scope_field任何类实例,访问的都是同一个类字段self.class_scope_field的初始值为 DemoClass.class_scope_field,  但随后的改动,将被绑定在 self 实例范围,跟类本身没有关系 class DemoClass    class_scope_field = “类作用域字段”
类方法 带装饰器 @classmethod的函数第一个参数一定为cls访问方式:DemoClass.class_method(),不带 cls参数不能访问 self成员可以通过cls, 直接访问类成员 cls. class_scope_field @classmethod def class_method(cls):     print(“类方法: classmethod_hello()”)
静态方法 带装饰器 @staticmethod不带任何固定参数访问方式: DemoClass.static_method()不能访问self成员静态方法就是普通的函数,只不过碰巧定义在了类里,而不是模块层。因此,完全可以将其放在跟类同模块的类定义前面或后面 @staticmethod def static_method():     print(‘静态方法: static_hello’)
成员字段(成员特性) 在成员方法中,前面加self进行定义按PEP8规范,所有成员字段,应该定义在 def __init__(self)方法中通过加下划线,约定访问范围访问方式: 通过self 或 实例对象变量名来访问 self.__private_field demo_instance.public_field def __init__(self, class_name):     print(“构造函数:__init__()”)     self.public_field = “公用字段”     self._protected_field = “受保护字段”     self.__private_field = “私有字段”
成员方法 python的函数,第一个参数一定为self通过加下划线,约定访问范围访问方式: 通过self 或 实例对象变量名来访问,访问时,带( ), 不需要带self参数 self.__private_method( ) demo_instance.public_method( ) 可通过self访问所有实例成员 def public_method(self): def _protected_method(self): def __private_method(self):  
成员属性(读) 带装饰器 @property的成员方法可在返回结果前,进行逻辑控制处理,并屏蔽内部的字段命名访问范围,按设计初衷,成员属性一般应该是公用的访问方式,通过 self 或 实例对象变量名来访问,访问时,不带(),跟字段一样,直接使用 self.public_property demo_instance.public_property @property def public_property(self):     return self._name.upper()
成员属性(写) 带装饰器 @指定属性名_setter的成员方法方法名称跟对应的成员属性名称一致第二个参数,为传入值参数对传入值可以进行逻辑处理,然后赋值给类的成员字段访问范围,跟对应的成员属性一致访问方式,通过 self 或 实例对象变量名来访问,只支持赋值,跟字段赋值一样 self.public_property = ‘new property’ demo_instance.public_property = “new property 2”   @public_property.setter def public_property(self, value):     self._name = value.lower()

发表评论