Python类(二):总结复习

继之前的类再补充一下知识点

在这里插入图片描述

魔术方法之__str__

先简单的说一说__str__的作用吧
  __str__方法是在使用print函数打印输出对象到屏幕时被调用的方法,用于返回对象的规范化字符串表现形式

举例

首先,我们要创建一个学生类(Students) 然后我可以调用一个方法返回显示对应学生的信息

#不用__str__
class Students:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def show(self):#定义返回方法
        return '姓名:{}  年龄:{}  性别:{}'.format(self.name,self.age,self.sex) 
zhaoliu = Students('赵六',29,'男')
show_Student = zhaoliu.show()
print(show_Student)
#可以看的出来有些麻烦,需要自己来调用show方法

#使用__str__方法
class Students:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return '姓名:{}  年龄:{}  性别:{}'.format(self.name,self.age,self.sex)
       	#返回到zhangsan这个变量中,由系统自己调用的__str__
       	#魔术方法都是自调用的
zhangsan = Proson('张三','男',20)
print(zhangsan)       
'''
可以看的出来使用__str__后,代码也少了,也不用繁琐的调用了
'''

但是需要注意的是__str__只能返回字符串哟!
class Student:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return self.age
 s = Student('小明',20,'男')
 print(s)#则会报错,TypeError: __str__ returned non-string (type int)
 #所以__str__只能返回str类型的

   
方法调用方法
小明的一天
class One_day(object):
    def start(self):
        print('小明一天开始了')
        self.morning()
    def  morning(self):
        print('上午,小明和同学们在踢毽子/玩游戏')
        self.afternoon()
    def afternoon(self):
        print('下午,小明就开始写暑假作业了')
        self.night()
    def night(self):
        print('打起了王者荣耀,玩的老开心了')
a = One_day()
a.start()
'''
方法的互相调用使我们的代码量减少了(合理使用)
'''

封装(私有化)

封装的作用:
  封装操作可以对受访问保护的成员进行功能开放的控制,达到保护数据不被非法访问的目的 
定义格式:
  self.__属性名 = 值

实例:

#李四发现自己写的东西,外面很容易就访问到了
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
l = People('李四',74,'男')
print(l.name)
print(l.age)
print(l.sex)
#于是他进行了私有化封装
class People:
    def __init__(self,name,age,sex):
        self.__name = name#他先对name进行了私有化操作
        self.age = age
        self.sex = sex
l = People('李四',74,'男')
print(l.__name)#但是这样做,使得他无法访问__name了
print(l.age)
print(l.sex)

#于是他又进行了学习,发现只要在函数内获取和修改就可以了
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def get_name(self):
        return self.__name
    def set_name(self,name):
    	#我们可以在这里做一些验证操作...
        self.__name = name         
l = People('李四',74,'男')
name = l.get_name()
print(name)#这样即可
print(l.age)
print(l.sex)
l.set_name('张三')	
print(dir(People))#我们可以看到的,其实Python的私有化并不是真正的私有化,只是进行了伪装
print(l._People__name)#对象._类__私有化属性  一样可以访问的到

私有化之@property

class People:
    def __init__(self,name,age,sex):
        self.__name = name
        self.age = age
        self.sex = sex
    @property
    def get_name(self):
        return '他叫{}'.format(self.__name)
    @get_name.setter#方法名.setter
    def set_name(self,name):
        if not isinstance(name,str):
            print('必须是str类型')
        else:
            print('之前的name是{} 修改后的name是{}'.format(self.__name,name))
            self.__name = name
a = People('小明',20,'男')
d = a.get_name#调用方法变了
a.set_name = '小李'#修改方法也变了,没有括号了

@classmethod类方法
类方法就是针对类属性而定义的

class People(object):
    color = 'Blue'#类属性
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def show(self):
        print(People.color)
        People.color = 'Red'
    @classmethod
    def get_color(cls,s):
        print('现在的颜色:',cls.color)
        cls.color = s

a = People('小李',20,'男')
a.show()
print('People颜色是:',People.color)
a.color = 'yellow'
print('a对象颜色是:',a.color)
print('People颜色是:',People.color)
a.get_color('pp')
a.show()
print(People.color)

在这里插入图片描述大致流程

__del__方法

销毁我们类创建的对象:
直接上代码吧!

import  sys#导入sys模块
class Person_:
    def __init__(self):
        print('----start')
    def __del__(self):
        print('销毁中.....')
a = Person_()
b = a
c = a
print(sys.getrefcount(a)-1)#3
#这段话是查看有多少个对象
#因为使用sys.getrefcount()的时候加了1所以减一
del c
del b
del a

有趣的是只要我们有类,并且有魔术方法__del__就会在类结束的时候自调用
class People:
    def __init__(self):
        self.name = '李四'
        self.age = 13

    def __del__(self):
        print('销毁中....')

a = People()

print('aa')#在这里我们并没有销毁对象
#但是奇怪的是,但我们执行完毕了后也会显示  销毁中....
#因为执行完毕后,空间就被回收了,所以就会这样

再推推
class People:
    def __init__(self):
        self.name = '赵六'
        self.age = 19
    def __del__(self):
        print('销毁中....')

a  =  People()
del a
print('-------------------')
'''
执行结果:
销毁中....
------------------

当我们类没有对象的时候就会输出销毁中...
内存空间给回收了也一样
'''

单例

直接举例

在这里有三种实现单例的方法

#__new__方法
class People(object):
    _instance = None
    def __int__(self,name,age):
        self.name = name
        self.age = age
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls)
            return cls._instance
        return cls._instance
zhangsan = People('张三',20)
print(id(zhangsan))
lisi = People('李四',21)
print(id(lisi))


#使用类方法
class People:
    def __int__(self):
        print('init')

    @classmethod
    def Establish(cls,*args,**kwargs):#类方法调用本类
        print('类方法')
        if not hasattr(People,'_instance'):#判断是否存在
            cls._instance = People(*args,**kwargs)#创建_instance类
            return cls._instance#返回地址
        return cls._instance#返回地址
a = People()#这个并不是单例
b = a.Establish()#这个才是 只有调用Establish方法才会
l = People()
p = l.Establish()#这个也是
print(id(b),id(p))
#b和P的内存地址的一致的

#使用装饰器
def Singleton(cls):
    _instance = {}
    def sing(*args,**kwargs):
        print('_sing Go!')
        if cls not in _instance:
            _instance[cls] = cls(*args,**kwargs)
        return _instance[cls]
    return sing

@Singleton#使用装饰器
class A(object):
    def __init__(self):
        pass
o  = A()
h = A()
print(id(o),id(h))



先到这里了,谢谢大家(草率)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值