外观
类和对象
创建类
在Python中,编写类时需要注意几个规则。首先,所有成员变量应当在构造方法内实现。若想要将某个变量设定为私有变量,需要在其前面加双下划线。而对于成员方法,则约定使用self作为第一个参数,代表对象本身。类的静态变量可以通过“类名.变量名”的方式设定。如果在类体内定义的方法前添加了@staticmethod装饰器,那么该方法将成为类的静态方法。实例化类的格式为“类名(参数)”。此外,若想访问对象的私有变量,可以使用“对象名._类名_变量名”的方式访问;而访问私有方法则需采用“对象名._类名__方法名()”的方式。
例:
class Demo:
def __init__(self, data=0, __data=0):
self.data = data # 所有的数据都在__init__()里面定义
self.__data = __data # 数据以两个下画线开头代表该变量为私有变量
def show_data(self): # 定义成员方法
print('data = ', self.data)
print('__data = ', self.__data)
def __pri_fun(self):
print('我是私有方法')
demo = Demo(1) # 实例化对象
print('demo的类型:', type(demo))
demo.show_data() # 调用成员方法
demo._Demo__pri_fun() # 调用私有方法运行结果:
demo的类型: <class '__main__.Demo'>
data = 1
__data = 0
我是私有方法类的继承
在大多数面向对象编程语言中,实现类的继承通常遵循以下几个步骤:
- 创建子类时,在类名后面使用括号指定要继承的父类。这告诉编程语言子类应该继承父类的属性和方法。
- 在子类的构造方法中,调用父类的构造方法以确保父类中的初始化工作得以执行。这通常通过调用父类的构造方法来实现,具体语法因编程语言而异。
- 可以在子类中重写父类的方法。这意味着你可以在子类中定义一个与父类方法同名的方法,以改变或扩展其行为。
例:
class Father:
def __init__(self):
print('父类初始化')
def show(self):
print('我是父类对象')
class Son(Father): # 子类继承父类
def __init__(self):
super(Son, self).__init__() # 调用父类方法
print('子类初始化')
def show(self): # 重写父类方法
print('我是子类对象')
father = Father()
father.show()
son = Son()
son.show()运行结果:
父类初始化
我是父类对象
父类初始化
子类初始化
我是子类对象装饰器
装饰器是在函数、成员变量或类名前面加上@xxx的标识表示这个对象具有一定属性。
- 在类的成员方法前面加上@property可以将此方法设为类的一个属性,可以直接调用对象的属性。
例:
class rect:
def __init__(self, width=0, height=0):
self.width = width
self.height = height
@property # 在函数定义的前一行加上@property则将此方法作为成员属性 调用时不需再加圆括号 同时最好要有返回值 此方法还可作为getter方法
def area(self):
return self.width * self.height
print('长为20宽为10的矩形的面积为: ', rect(20, 10).area) # 调用函数时不需要再加上圆括号运行结果:
长为20宽为10的矩形的面积为: 200- 在属性前面加上@property可以将此属性设为只读 可以保护此数据
例:
class data:
def __init__(self, data=None):
self.__data = data
@property # 可以尝试注释此代码前后的执行结果
def data(self):
return self.__data
data1 = data(0)
print('修改前的数据为: ', data1.data)
data1.data = 1
print('修改后的数据为: ', data1.data)运行结果:
修改前的数据为: 0
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In [2], line 12
10 data1 = data(0)
11 print('修改前的数据为: ', data1.data)
---> 12 data1.data = 1
13 print('修改后的数据为: ', data1.data)
AttributeError: can't set attribute 'data'