面向对象程序设计二

面向对象程序设计二,第1张

注意:本章笔记代码模块中的__,部分场景由于显示问题,将双下划线连接在一起,实际上为双下划线(编译环境中显示样式:_ _)

  • 类方法
    • 直接属于类
    • 类方法不可使用实例变量(参数标识符是cls,而不是self)
    • 类方法不可调用实例方法
    • 外部直接调用类属性(计数使用方便,但普通方法也可实现)
    • 类方法示例:
class Game:
    classgametype = 'FPS'
    def __init__(self,formgametype): #设置外部数据传入实例属性的入口,形参formgametype
        self.gametype = formgametype #设置实例的一个属性gametype,并传入外部数据
    def Gametype(self): #打印实例属性定义的gametype的方法
        print('实例属性定义的游戏类型是:', self.gametype)
# 类方法语句模块------------------------------------------------------------------------
    @classmethod   # 类方法声明,声明这个方法是类方法   
    def Gametypeclass(cls): #方法变量名为当前通用标识符为cls,此处可替换为类名Game   
        print('类属性定义的游戏类型是:', cls.classgametype) #调用当前类属性classgametype
# ---------------------------------------------------------------------------------
wzry = Game('MOBA')    # 外部数据通过形参导入实例属性
wzry.Gametype()    # 打印实例属性定义的Gametype
wzry.Gametypeclass()    # 打印类属性定义的Gametype
# 输出结果:
# 实例属性定义的游戏类型是:MOBA
# 类属性定义的游戏类型是:FPS
  • 类方法统计实例化个数,示例:

class Game:
    num = 0    # 计数记录
    def __init__(self,formgametype):#设置外部数据传入实例属性的入口,形参formgametype
        self.gametype = formgametype #设置实例的一个属性gametype,并传入外部数据
        Game.num += 1    # 每实例化一次后,num+1,可用_ _class_ _.num替换,方便修改
    @classmethod
    def numcount(cls):    # 注意括号内为cls,表示当前类
        print('一共实例化', cls.num, '个实例')    # 直接调用类属性
wzry = Game('MOBA')
jdqs = Game('FPS')
Game.numcount()    # 调用类Game中的方法numcount
# 输出结果:
# 一共实例化了2个实例
  • 类中访问权限控制
    • @property:将方法变成属性,访问方式改变,方法必须有返回值,因为是属性
      • 原,访问方式:class.method()
      • 使用@property后,访问方式:class.method
    • class内部私有方法:前置双下划线def _ _methodname(self)
      • 表示仅class内部可访问,class外不可访问,_ _表示隐藏符号
      • 用_ _后,class内部调用标识符为._ _parameter,不是.parameter
    • class内部私有变量:前置双下划线self._ _parameter
# 无限制访问
class School:
    area = 'China'
    def __init__(self,formpnum):
        self.pnum = formpnum
HKU = School(1000)
print(HKU.pnum)
# 打印得到 1000
# --------------------------------------------------------------------------------
# _ _设置class内部访问权限后
class School:
    area = 'China'
    def __init__(self,pnum):
        self.__pnum = pnum    # 限制class内部访问权限
HKU = School(1000)
print(HKU.__pnum)    
# 打印得到:
# AttributeError: 'School' object has no attribute 'pnum'
# 属性错误:'School'对象没有'pnum'属性
# --------------------------------------------------------------------------------
class School:
    area = 'China'
    def __init__(self,pnum):
        self.__pnum = pnum    # 限制class内部访问权限
# 以下语句涉及的过程有:建立打印私有变量 self.__pnum的解决办法,将方法变为类属性的过程
    @property
    def getpnum(self):
        return self.__pnum
HKU = School(1000)
print(HKU.getpnum)
# 打印得到 1000
  • 构造函数
    • 基本知识
      • 构造实例的进程函数
      • 语法 : def _ _init_ _(self)
        • self表示当前实例,不可缺少
      • 不能设置return值
      • class执行当前实例的函数
    • 参数传递
# self 表示当前实例!!!!!!!!
class Game:
    gametype = 'FPS'   # 类属性,验证这个功能时可以略去
    systemtype = 'mobile game'  # 加入可观察验证仅访用机制
# self 表示当前实例!!!!!!!!
    def __init__(self,sgametype,ssystem):   # 定义参数(外部数据)传入入口
        self.gametype = sgametype    # 设置实例的第一个属性gametype
        self.systemtype = ssystem    # 设置实例的第二个属性systemtype
# self 表示当前实例!!!!!!!!
wzry = Game('MOBA','PC')   # 实例化语句,传入参数(外部数据)给实例属性
print(wzry.gametype, wzry.systemtype)    # 打印实例wzry的两个属性
print(wzry.__dict__)    # 检验实例字典,结果说明参数成功传入实例,并保存在实例dict里

 

  • 构造函数内的参数调用
    • eg.
    • Y参数传入构造函数,其他方法也可以调用Y参数, 语法:self.parameter
class Game:
    def __init__(self, sgametype):  # 定义形参Y:sgametype
        self.gametype = sgametype
    def printgametype(self):
        print('这个游戏的类型是:', self.gametype)    # self.xxx调用Y参数
wzry = Game('MOBA')  # 实例化,并传入形参的内容
wzry.printgametype()    # 实例调用类方法
# 输出结果:这个游戏的类型是 MOBA

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/713893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存