【摘要】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 执行代码块开始执行了, 但整个过程只执行一次!') |
类字段(类特性)
|
|
class DemoClass class_scope_field = “类作用域字段” |
类方法 |
|
@classmethod def class_method(cls): print("类方法: classmethod_hello()") |
静态方法 |
|
@staticmethod def static_method(): print('静态方法: static_hello') |
成员字段(成员特性) |
self.__private_field demo_instance.public_field |
def __init__(self, class_name): print("构造函数:__init__()") self.public_field = "公用字段" self._protected_field = "受保护字段" self.__private_field = "私有字段" self._name = class_name |
成员方法 |
self.__private_method( ) demo_instance.public_method( ) |
def public_method(self): def _protected_method(self): def __private_method(self):
|
成员属性(读) |
self.public_property demo_instance.public_property |
@property def public_property(self): return self._name.upper() |
成员属性(写) |
self.public_property = ‘new property’ demo_instance.public_property = “new property 2” |
@public_property.setter def public_property(self, value): self._name = value.lower() |
三. 实例代码及演示:
# coding:utf-8
# -----------------------------------------------------------------------------
# Comments : 演示说明python类的基本成员定义及使用
# Developer : Edwin.Zhang
# Date : 2018-8-28
# -----------------------------------------------------------------------------
def normal_method():
print("*.调用正常函数:normal_hello()")
# 类名的命名规范为: CamelCase
class DemoClass:
print('【演示】Class 执行代码块开始执行了, 但整个过程只执行一次!\n')
class_scope_field = "类作用域字段"
def __init__(self, class_name):
print("构造函数:__init__()")
self.public_field = "公用字段"
self._protected_field = "受保护字段"
self.__private_field = "私有字段"
self._name = class_name
def __del__(self):
print("析构方法:__del__() for [" + self._name + "], 什么时候被调用,不确定,请谨慎使用!")
@property
def public_property(self):
return self._name.upper()
@public_property.setter
def public_property(self, value):
self._name = value.lower()
def public_method(self):
print('*.公用方法:public_hello() : ' + self.public_field + " " + self.public_property)
def _protected_method(self):
print('*.受保护方法:_private_hello() : ' + self.__private_field)
def __private_method(self):
print('*.私有方法:_private_hello() : ' + self.__private_field)
@classmethod
def class_method(cls):
print("*.类方法: classmethod_hello()")
print("*.类方法访问 " + cls.class_scope_field)
@staticmethod
def static_method():
print('*.静态方法: static_hello')
def internal_call(self):
self.public_method()
self._protected_method()
self.__private_method()
self.class_method()
self.static_method()
DemoClass.class_method()
DemoClass.static_method()
normal_method()
self.public_property = "new setting property"
print("*.访问公共属性 :" + self.public_property)
print("*.通过self, 访问:" + self.class_scope_field)
print("*.通过类名, 访问:" + DemoClass.class_scope_field)
def demo0():
print(DemoClass.public_property)
def demo1():
instance = DemoClass('My Demo Class')
print("\n【演示】类内部,调用的成员")
instance.internal_call()
print("\n【演示】通过对象实例,调用的方法")
instance.public_method()
instance.class_method()
instance.static_method()
print("\n【演示】通过对象实例,访问字段及属性")
print(instance.public_field)
print(instance.public_property)
instance.public_property = "new class name"
print(instance.public_property)
print("\n【演示】通过类名,访问类字段及类方法")
print(DemoClass.class_scope_field)
DemoClass.class_method()
DemoClass.static_method()
def demo2():
print("\n\n\n【演示2】类型字段可以在多个类实例共享,若绑定到self并修改,则只作用于当前实例")
print("Case 1 : \n*.实例初始化时: 两者一致")
ins1 = DemoClass("Instance 01")
print("ins1.class_scope_field = " + ins1.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("\n*.基于(实例)修改后, 成员已经绑定self, 两者不一致")
ins1.class_scope_field = "基于(实例)修改类作用域字段"
print("ins1.class_scope_field = " + ins1.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("\n*.基于类修改后:(已经发生基于(实例)修改过):两者不一致")
DemoClass.class_scope_field = "基于类修改类作用域字段"
print("ins1.class_scope_field = " + ins1.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("")
print("\nCase 2 : \n*.创建新的实例:开始两者一致,为类成员当前值")
ins2 = DemoClass("Instance 02")
print("ins2.class_scope_field = " + ins2.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("\n*.基于类修改后:(没有基于(实例)修改过),两者一致,为更新值")
DemoClass.class_scope_field = "基于类修改类作用域字段 (新)"
print("ins1.class_scope_field = " + ins2.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("")
print("\nCase 3: \n*.创建新的实例:两者一致,为类成员的更新值")
ins3 = DemoClass("Instance 03")
print("ins2.class_scope_field = " + ins3.class_scope_field)
print("DemoClass.class_scope_field = " + DemoClass.class_scope_field)
print("")
if __name__ == "__main__":
demo0()
demo1()
demo2()