python中的类

'''
面向过程:
    以结果为目的
面向对象:
    以设计的角度去考虑问题-----注重程序的扩展性、维护性
    扩展性:继承、多态,功能扩展
    维护性:分模块开发(分类)
类:
    不是一个具体的实物,比较抽象,只是一个设计的模型
对象:
    由类这个模型产生出的具体对象(多个),但是对象之间并没有什么关系(体现出程序的扩展性),每个对象都有自己的内存地址
    对象都是要加载到内存的,其实类也是能够加载到内存中的(反射)

面向对象的思想:
    封装

    继承

    多态

销毁时间:
    在程序执行完毕自动销毁
    也可以手动销毁del,一旦销毁不可在使用

1、对象中的函数:只要是类中的函数都要带self
    1.构造函数__init__(self,可以有参数),可对变量赋值
        定义类变量:
            self.变量名=value (普通变量)
            self.__变量名=value(具有访问权限的变量)
        继承中的构造函数:
            单继承:
                super(子类名, self).__init__():
                        python2中常用,父类的构造函数如果有参数必须要先调用父类的构造函数并赋值,没有参数最好也调用
                super().__init__():
                        python3中常用
                父类名.__init__():
                        也可以实现父类方法的调用
            多继承:
                父类名.__init__(self),由于不确定是那个父类所以用父类名调用
                注意:父类名是传递过来的(继承的格式)
        有参:
            要重写父类的__init__()并传递参数
        无参:
            可以不写,也可以写出来,对象在创建时其实就是调用的构造函数
    2.析构函数__del__(self)
        在对象销毁(不再占用内存)或者程序结束时会自动执行,程序结束是指整个运行的程序结束时,也就是整个程序代码执行完毕时
        1.del手动销毁对象
        2.整个程序执行完毕(全局变量)
        3.覆盖(应该是该对象不再使用,垃圾回收机制销毁了该对象)
        4.当对象是局部变量时,比如函数中的对象,在函数执行结束而被销毁
        总之对象不再占用内存(销毁)时,就会执行析构函数
    3.__str__(self):只能return str
        在打印对象时会自动调用该函数显示该对象的信息,当然也可以覆盖用来打印类中变量的信息来使用
    4.__repr__(self)
        同__str__(self)一样,只有在str不存在时才会调用repr,两者都存在只执行str
2、变量
    python可以动态创建变量,即可以在类外创建变量(一般不用)
    1.对象中的变量
        随对象的创建而创建,随对象的销毁而销毁
    2.函数中的变量
        随函数的销毁而销毁(函数执行完)
    3.实例变量:
        对象名调用,对象可以访问类变量,但是不能修改类变量(会创建一个新的实例变量,坑)
        实例调用和类同名的变量,优先调用实例变量
    4.类变量
        类名调用,类不可访问实例变量
    5.生命周期:
        实例变量:
            对象销毁变量就销毁
        类变量:
            随类创建而创建随类销毁而销毁
    6.类的生命周期:
        程序结束
    注意:python可以动态添加实例变量
3、类中的权限
    目的:
        设置访问权限,防止数据被别人修改,限制别人调用一些属性或者函数
    用法:
        类中的变量名或者方法名前面加上两个下划线
4、类的属性
    get(self): 也可以用@property注解,使调用时用实例.方法名或者属性名即可,不用在最后带上函数的小括号(没啥用)
        获取类的不可直接访问属性
    set(self,参数): 也可以用@方法名.setter注解 ,实例.方法名或者属性名=值
        设置类的不可直接访问属性,可以设置一些逻辑过滤代码
    属性的声明限制: __slots__ = (变量)
        __slots__ = ("a","version"),网上说更快的属性访问速度
        不加声明限制(默认)每个实例都会创建一个字典来存储属性(键值对),加了__slots__=()不会再创建字典来存储实例的属性(自己定义的属性,非python标准库的),在使用该属性时会报错no attribute
    注意:子类添加__slots__要考虑父类(父类如果不加__slots__=(),子类就不受该限制,正常创建字典正常存储实例属性)
5、格式
    class 类名:
        pass

6、继承(可多继承)
    当多个类都有大量相同的代码的时候使用继承
    1.含义:
        子类继承父类,子类拥有了父类的所有属性和方法(非私有的)
    2.作用:
        减少代码量:
            父类已有的直接调用即可不需要再写逻辑代码
        扩展功能:
            在父类的基础上添加父类所没有的功能,扩大子类的功能(子承父业,青出于蓝而胜于蓝)
    3.格式:可以多继承,用逗号隔开
        class 子类类名(父类名1,父类名2):
            pass
        注意:当父类中有相同的方法或者属性,优先级:从左到右
    4.缺点:
        程序要求高内聚低耦合,同一个类中的关系要紧密,不同类之间要尽量减少联系,否则牵一发而动全身

7.多态:多种形态
    对象在不同时刻体现的不同形态就是多态(多种身份)
    前提:
        继承(无继承不多态)
8、@property:
        在方法上添加,节省一个括号
    函数名.setter:
        在方法上添加
    注意:要先写取值,即:先写@property再写,函数名.setter
    知道就行,不用
'''
'''
一部手机:类
    属性:
        颜色、内存、型号、价钱-----变量
    行为:
        打电话、玩游戏-----函数
'''
# class phone:
#     color=None#类变量
#     def __init__(self):
#         pass
#     def a(self):
#         print(self)
#         phone.color="红色"
#         print(phone.color)

# class phone:
#     #定义有参构造函数
#     def __init__(self,version,color,price,RAM):
#         #定义类变量,两个下划线表示只能本类中能够访问
#         self.__version=version
#         self.__color=color
#         self.__price=price
#         self.__RAM=RAM
#     # 重写__str__(self)方法,打印对象的时候自动调用
#     def __str__(self):
#         return  self.__version+"手机"
#     #重写__del__(self)方法,在对象销毁时执行
#     def __del__(self):
#         print("关机。。。。。")
#     #设置类属性,并对外提供
#     def setVersion(self,version):
#         self.__version=version
#     #对外提供可访问的方法
#     def getVersion(self):
#         return self.__version
#     @property#取值,get
#     def color(self):
#         return self.__color
#     @color.setter#赋值,set
#     def color(self,color):
#         self.__color=color
#     def getPrice(self):
#         return self.__price
#     def getRAM(self):
#         return self.__RAM
#     def call(self,person):
#         print("用%s、售价为%d的%s手机给%s打电话。。" %(self.__color,self.__price,self.__version,person))
#     def playGame(self,game):
#         print("用%s、售价为%d的%s手机玩%s游戏。。。" %(self.__color,self.__price,self.__version,game))
#     def watchVideo(self,video):
#         print("用%s、售价为%d的%s手机看%s视频。。。" %(self.__color,self.__price,self.__version,video))

# class erji(phone):#耳机
#     __slots__ = ("a")
#     #父类构造函数的重写
#     def __init__(self,version,a,b):
#         # super(erji, self).__init__("华为","红色",1999,"4G")#单继承
#         #调用父类的构造函数,给父类的有参构造函数赋值
#         phone.__init__(self,"华为","红色",1999,"4G")#单继承或者多继承
#         #无访问权限的类变量
#         self.version=version
#         self.a=a
#         self.b=b
#
#     def erjiCall(self,person):
#         print("用%s、售价为%d的%s手机的%s耳机给%s打电话。。。" %(self.getColor(),self.getPrice(),self.getVersion(),self.version,person))
#     #父类普通函数的重写
#     def call(self,person):
#         print("复写父类的方法。。。")
#
# p=phone("华为","红色",1999,"4G")
# # # p.call("张三")
# # e=erji("小米","a","b")
# # # e.erjiCall("李四")
# # print(e.version,e.b)
# #get和set注解的测试
# # p.color="黑色"
# # print(p.color)

# class a:
#     # __slots__ = ("b")#父类会影响子类
#     def __init__(self,a):
#         self.a=a
#     #重写加法运算,self加法前的对象,other加法后的对象
#     def __add__(self, other):
#         return self.a+other.a
#
#     # __dict__ = {"f":"小红"}
#
# # print(a("b","c").c)
# class d:
#     # __slots__ = ("f")
#     def __init__(self,d):
#         self.d=d
# a1=a(1)
# a2=a(2)
# print(a1+a2)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值