Python面向对象高级编程

一 构造方法与析构方法

构造方法: def _ init _(self) 在实例化对象时自动执行。
析构方法:def _ del _(self) 当删除对象时,自动调用的方法。 

析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数

class People(object):
    def __init__(self,name,age):#实例化对象时自动执行
        #把属性和对象名绑在一起,便于访问对象的属性
        self.name=name
        self.age=age
        print('创建对象成功...')
        #析构函数,当你删除对象时,自动调用的方法
        #del 对象名或者程序执行结束之后
    def __del__(self):
        print('删除对象成功...')
if __name__=='__main__':
    #创建对象
    p1=People('fensi',10)
    print(p1)

在这里插入图片描述
由上可见:当我们程序执行结束后,执行了del 析构函数,输出删除对象成功,或者删除对象时执行
在这里插入图片描述

二 __str__和__repr__的方法

str和repr都是对对象的字符串显示, 使用场景不同.
如果没有__str__的时候, 自动调用__repr__方法的内容.

class People(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print('创建对象成功...')
    def __del__(self):
        print('删除对象成功...')
    #__str__和__repr__都是对对象的字符串显示,使用场景不同
    #如果没有__str__的时候,自动调用__repr__方法
    def __str__(self):
        #print(对象名)    print(str(对象名))
        #print('People(%s,%d)' %(self.name,self.age))
        return 'people(%s,%d)' %(self.name,self.age)
    def __repr__(self):
        #print(repr(对象名))
        return 'people(%s)' % (self.name)
    def __hello(self):
        print('hello')
    def world(self):
        self.__hello()
if __name__=='__main__':
    p1=People('fensi',10)
    print(p1)
    print(p1.__repr__())
    print(p1.__str__())
    p1.world()

在这里插入图片描述

三 字符串format方法

常见的如下:

print('name:%s,age:%d,scores:%s' %('westos',10,dict(a=80,b=90)))
print('name:%s,age:%d,scores:%s' %('westos',10,(80,90)))
print('name:%s,age:%d,name:%s' %('westos',17,'redhat'))
  • 通过位置填充字符串
    在这里插入图片描述
  • 通过key值填充字符串
    在这里插入图片描述
  • 通过下标或者索引值填充
    在这里插入图片描述
    面向对象操作
class Book(object):
    def __init__(self,name,author,state,Id):
        self.name=name
        self.author=author
        self.state=state    #0代表已借出,1代表未借出
        self.Id=Id
    def __str__(self):
        return 'Book(%s,%d)' %(self.name,self.state)
b=Book('python','guidu',1,'num12')
print('name:{b.name},author:{b.author},state:{b.state}'.format(b=b))
#print('name:{0.name},author:{0.author},state:{0.state}'.format(b))

在这里插入图片描述

四 format魔术方法

formats={
    'ymd':'{d.year}-{d.month}-{d.day}',
    'mdy':'{d.month}/{d.day}/{d.year}',
}
class Date(object):
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    #format方法:format(对象名)时自动调用
    def __format__(self,format_spec=None):
        # return "这是显示format的内容"
        # if format_spec:
        #     format_spec = format_spec
        # else:
        #     format_spec = 'ymd'
        if not format_spec:
            format_spec='ymd'
        fmt=formats[format_spec]
        return fmt.format(d=self)
d=Date(2019,2,3)
print(format(d))
print(format(d,'mdy'))
print(format(d,'ymd'))
print(d.__format__('ymd'))

在这里插入图片描述
简化版本

class Date(object):
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    def __format__(self, format_spec=None):
        if not format_spec:
            return '%s-%s-%s' %(self.year,self.month,self.day)
        else:
            if format_spec=='ymd':
                return '%s-%s-%s' % (self.year, self.month, self.day)
            elif format_spec=='dmy':
                return '%s/%s/%s' %(self.day,self.month,self.year)
            else:
                return 'Error'
d=Date(2019,5,6)
print(format(d))
print(format(d,'ymd'))
print(format(d,'dmy'))

在这里插入图片描述

五 类内部装饰器@property

将类方法变成类属性,使调用类中的方法像引用类中的字段属性一样。

class Book(object):
    def __init__(self,name,author,state,Id):
        self.name=name
        self.author=author
        self.state=state
        self.Id=Id
    #将类方法变成类属性
    #使用时,没有装饰器b.state()和有装饰器b.state
    @property
    def state(self):
        if self.__state==0:
            return '已借出'
        elif self.__state==1:
            return '未借出'
        else:
            return '状态异常'
    #当修改属性state时,自动执行下面的方法,b.state=10
    @state.setter
    def state(self,value):
        if value in (0,1):
            #更新书籍状态
            self.__state=value
    @state.deleter
    def state(self):
        print('is deteling..')
    def __str__(self):
        return 'Book(%s,%d)' %(self.name,self.state)
b=Book('python','guido',1,'num12')
print(b.state)
b.state=0
print(b.state)
del b.state

在这里插入图片描述

六 实现类的切片和索引

class Student(object):
    def __init__(self,name,scores):
        self.name=name
        self.scores=scores
    #支持索引;s[key]
    def __getitem__(self, key):
        print('获取索引对应的value值')
        return self.__dict__[key]
    #s[key]=修改的值
    def __setitem__(self, key, value):
        self.__dict__[key]=value
    #del s[key]
    def __delitem__(self, key):
        del self.__dict__[key]
    def hello(self):
        return 'hello'
s=Student('westos',[100,98,96])
#key获取value值
#可以获取所有的属性为key值以及对应的value值
print(s.__dict__)
print(s['name'])
print(s['scores'])
s['name']='westos1'
print(s['name'])
print(s.scores)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七 类的重复与连接的实现

from collections import Iterable
class Student(object):
    def __init__(self, name, scores):
        self.name = name
        self.scores = scores
        self.power = 100
    # obj1 + obj2
    def __add__(self, other):
        # 更新self对象的power属性值;
        self.power = self.power + other.power
        return  self
    # obj1 * 3
    def __mul__(self, other):
        # *的效果是, 能量*power
        return  self.power * other
    # 成员操作符; item in obj1
    def __contains__(self, item):
        return  item in self.scores
    # 可以for循环迭代
    def __iter__(self):
        # 迭代返回的是成绩
        return  iter(self.scores)
    def __repr__(self):
        return  "Student:%s,%s" %(self.name, self.power)
print("hello " + "world")
print([1,2,3] + [3,4,5])

s1 = Student('westos1', [101,100,100])
s2 = Student('westos2', [100,100,100])
s3 = Student('westos3', [100,100,100])

# 连接的实现;
# "hello" + "world" + "hwllo"
print(s1 + s2 + s3)
# 重复:
# a = 3; print(a*3)
# s = 'a'; print(s*3)
# li = [1,2,3]; print(li*3)
print(s1*3)


# 成员操作符
print(s1.scores)
print(200 in s1)
print(100 in s1)
print(200 not in s1)

# for循环迭代
for i in s1:
    print(i)
print(isinstance(s1, Iterable))

在这里插入图片描述

八 类方法与静态方法

1.类方法@classmethod
默认传递类本身给这个方法;
如果使用原本的方法传递给类,是只能传递一个一个数,无法传递一个整体
所以调用classmethod,将传入值进行处理后,把返回值传入__init__进行数值初始化.

class Date(object):
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    #echo普通方法,默认情况下会传递对象给echo
    def echo(self):
        return '%s %s %s' %(self.year,self.month,self.day)
    #默认传递类本身给这个方法
    @classmethod
    def as_string(cls,s):
        print(cls)
        month,day,year=s.split('/')
        d=cls(year,month,day)
        return d
s = '10/10/2018'
print(Date.as_string(s).echo())

在这里插入图片描述
2.静态方法
默认python解释器不会传递任何参数

class Date(object):
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day =  day
    #默认python解释器不会传递任何参数
    @staticmethod
    def is_vaild(s):
        # 批量将年月日转换成整形(列表生成式, map)
        # month,day,year=s.split('/')
        # month,day,year=[int(i) for i in s.split('/')]
        month,day,year=map(int,s.split('/'))
        return 0<month<=12 and 0<day<=31 and 1<year<9999
s = '10/10/2018'
print(Date.is_vaild(s))
d=Date(2019,12,12)
print(d.is_vaild('12/12/2019'))

在这里插入图片描述

九 面向对象的反射机制

反射: 让对象告诉我们相关信息(对象拥有的属性和方法, 对象所属的类等…)
1.显示对象所拥有的方法和属性
在这里插入图片描述
2.判断对象所属的类
在这里插入图片描述
在这里插入图片描述
3.根据对象可以获取的内容
在这里插入图片描述
4. hasattr, getattr, setattr, delattr
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值