大家好,今天是21天python打卡的第7天,上一篇讲了python关于面向对象编程的相关知识,类是什么,以及面向对象三要素。今天我们来说说python如何创建类,抽象类,访问限制的说明。

活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录
首先,我们创建一个类,示例如下。
-
- # -*- coding: UTF-8 -*-
-
- from random import choice
-
- class Divergence:
-
- def __init__(self,name='robot'):
- self.name = name
- pass
-
- def getChoice(self,name=None):
- if name is not None:
- self.name = name
- self.__lists = ['剪刀','石头','布']
- result = choice(self.__lists)
- print(self.name,':选择了>',result)
定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。
在上面的代码中,由于构造方法除 self 参数外,还包含 name参数,且设置了默认参数,因此在实例化类对象时,按需传入相应的 name 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)
定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:
访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。
下面验收如何使用:
- #实例化对象的时候传递name参数
- d = Divergence('A')
- d.getChoice()
-
- #实例化时不传递参数
- d = Divergence()
- #调用方法时传递
- d.getChoice('A')
我们通过实例来说明如何创建对象。
创建点对象,有多种方式创建一个类的实例,我们称一个点的x、y、z都一样的点为对角点。
# -*- coding: UTF-8 -*- class Point: # TODO(You): 添加代码支持类的创建 if __name__ == '__main__': points = [] # TODO(You): 批量创建1000个对角点,第i个点的坐标是 (i,i,i) for point in points: print(point)可以这样补全代码
class Point: def __init__(self, x, y, z): self.x = x self.y = y self.z = z if __name__ == '__main__': points = [] for i in range(1000): points.append(Point(i,i,i))
下面通过具体python题目说明抽象类的概念
使用 abc 库,创建抽象 BasePoint 类,创建 Point 子类,实现 dot 抽象方法,计算内积
# -*- coding: UTF-8 -*- import abc # TODO(You): 请实现抽象类 BasePoint class Point(BasePoint): def __init__(self, x, y, z) -> None: super().__init__(x, y, z) def dot(self, right): return self.x*right.x+self.y*right.y+self.z*right.z if __name__ == '__main__': p1 = Point(0, 1, 2) p2 = Point(2, 4, 6) assert p1.dot(p2) == 16 p1 = BasePoint(0, 1, 2) p2 = BasePoint(2, 4, 6) assert p1.dot(p2) is None补全代码如下
class BasePoint: def __init__(self, x, y, z) -> None: self.x = x self.y = y self.z = z @abc.abstractmethod def dot(self, right): pass
做访问限制,是为了程序的健壮性。如果可以从外部对函数里面重要的属性进行任意修改,有可能程序崩溃只是因为一次不经意地参数修改。
默认情况下,可从外部访问对象的属性。若让属性不能从对象外部访问,可将属性定义为私有。
私有属性只能通过存取器方法来访问
Python没有为私有属性提供直接的支持,要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可
- class Apple():
- def name(self,name):
- self.__name = name
-
- def getName(self):
- return self.__name
与属性一样,只需要在函数名前面添加两个下划线打头既可实现私有函数;
- class Apple():
- def __setAge(self,age):
- self.__age = age
-
- def getName(self):
- return self.__name
-
- def info(self,age):
- self.__setAge(age);
-
在Python中,以双下划线开头,并且以双下划线结尾的变量是特殊变量如__name__,特殊变量是可以直接访问的;
按照约定俗成的规定,以一个下划线开头的实例变量名(例如_category) 外部也是可以直接访问的,但是这个形式的变量表达的意思是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”
在 Python 中使用反射可以得到对象的所有属性,这个机制被称为反射(反过来让对象告诉我们他是什么),用于实现在运行时获取未知对象的信息。
dir([obj]):
调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
hasattr(obj, attr):
这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
getattr(obj, attr):
调用这个方法将返回obj中名为attr值的属性的值,
setattr(obj, attr, val):
调用这个方法将给obj的名为attr的值的属性赋值为val。
type(obj)
判断对象类型,使用type()函数
今天就介绍到这里,下一篇我们说说python的基本技能。