Python——面向对象的进一步分析

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

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('hello', 10)

这里写图片描述
当我们程序执行结束后,执行了del 析构函数,输出 删除对象成功
或者删除对象时执行

p1 = People('hello', 10)
del p1

二 对象str和repr方法
作用是:返回一个可以用来表示对象的可打印字符串
继续使用上面的类

class People(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # 两者都是对对象的字符串的显示,使用场景不同
    # 如果没有 __str__时, 自动调用 __repr__方法的内容

    def __str__(self):
        # print(对象名) print(str(对象名))
        return 'People(%s,%d)' % (self.name, self.age)

    def __repr__(self):
        # print(repr(对象名)) 或者交互式环境中直接:用户名
        return 'People(%s)' % (self.name)
if __name__ == '__main__':
    p1 = People('hello', 10)
    print(p1)
    print(repr(p1))
    print(str(p1))

这里写图片描述
用来显示对象的信息
三 字符串的format方法
1) 通过位置填充字符串

print('name:{0},age:{1},scores:{2}'.format('westos', 10, [100, 99, 78]))
print('name:{0},age:{1},scores:{0}'.format('westos', 10))

这里写图片描述
2) 通过key值填充字符串

d = {'max': 100, 'min': 10}
print("MAX: {max}, MIN:{min}".format(max=100, min=10))
print("MAX: {max}, MIN:{min}".format(**d))

这里写图片描述
3) 通过下标或者索引填充字符串

point = (3,4)
print("x:{0[0]}, y:{0[1]}".format(point))

这里写图片描述
4) 面向对象操作

class Book(object):
    def __init__(self, name, author, state, bookIndex):
        self.name = name
        self.author = author
        # 0:'已借出' 1:'未借出'
        self.state = state
        self.bookIndex = bookIndex

    def __str__(self):
        return  'Book(%s, %d)' %(self.name, self.state)
b = Book('python', 'guido', 1, 'IND444')
print("name:{b.name}, state:{b.state}, author:{b.state}".format(b=b))
print("name:{0.name}, state:{0.state}, author:{0.state}".format(b))

这里写图片描述
第一个输出为通过对象填充
第二个输出为通过位置填充
四 formot魔术方法

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):
        if not format_spec:
            format_spec = 'ymd'
        fmt = formats[format_spec]  # fmt 为 {d.year}-{d.month}-{d.day}
        return fmt.format(d=self)


d = date(2018, 8, 25)
print(format(d))
print(format(d, 'mdy'))

这里写图片描述
通过format方法来调整日期的输出格式
五 类内部的装饰器
property:将类方法变为类属性

class Book(object):
    def __init__(self, name, author, status, bookIndex):
        self.name = name
        self.author = author
        # 0:已借出;1:未借出
        self.__status = status
        self.bookIndex = bookIndex

    @property  # 类内部装饰器
    # 将类方法变为类属性
    # 使用时,若没有装饰器b.status()
    # 使用时,若有装饰器b.status
    def status(self):  # 让其显示为可示的状态,而不是 0 或者 1
        if self.__status == 0:
            return '未借出'
        elif self.__status == 1:
            return '已借出'
        else:
            return '状态异常'

    @status.setter
    #当修改属性status时,自动执行下面的方法 b.status=0
    def status(self, value):  # 如果人为的更改状态的话,将其局限于 0 或者 1
        if value in (0, 1):
            self.__status = value
        else:
            return 'error value'

    def __str__(self):
        return 'Book(%s,%d)' % (self.name, self.__status)


b = Book('python', 'guido', 1, 'UH32970')

print(b.status)
b.status = 0
print(b.status)

这里写图片描述
将类方法变为类属性,不用再去执行,直接调用即可
六 类的切片与索引
1) 如果能允许进行索引,那么就允许进行切片

class Student(object):
    def __init__(self, name, scoers):
        self.name = name
        self.scores = scoers

    def __getitem__(self, item):
        # 获取索引对应的value值
        return self.scores[item]

    def __setitem__(self, key, value):
        # 通过索引来修改value值
        self.scores[key] = value

    def __delitem__(self, key):
        # 通过索引来删除value值
        del self.scores[key]
#
#如果能允许进行索引,那么就允许进行切片
#
#索引操作
s = Student('westos', [10, 23, 43])
print(s[0])
s[0] = 12
del s[2]
print(s.scores)
#切片操作
print(s[:3])
s[1:]=[77,99]
print(s[:])
#删除操作
del s[2:]
print(s[:])

这里写图片描述
2) key——value

class Student(object):
    def __init__(self, name, scoers):
        self.name = name
        self.scores = scoers

    def __getitem__(self, item):
        # 获取key对应的value值
        return self.__dict__[item]

    def __setitem__(self, key, value):
        # 通过key来修改value值
        self.__dict__[key] = value

    def __delitem__(self, key):
        # 通过key来删除value值
        del self.__dict__[key]


s = Student('westos', [10, 23, 43])
print(s.__dict__)

print(s['name'])
print(s['scores'])

s['name'] = 'root'
print(s['name'])

del s['name']
print(s.__dict__)

这里写图片描述
3) 重复,连接,成员操作符,for循环

from collections import Iterable


class Student(object):
    def __init__(self, name, scoers):
        self.name = name
        self.scores = scoers
        self.power = 100

    # s1+s2
    def __add__(self, other):
        return self.power + other.power

    # s1*other
    def __mul__(self, other):
        return self.power * other

    # 成员操作符
    def __contains__(self, item):
        return item in self.scores

    # for循环
    def __iter__(self):
        return iter(self.scores)


s1 = Student('westos', [29, 54, 45])
s2 = Student('root', [33, 55, 22])

# 连接
print(s1 + s2)

# 重复
print(s1 * 3)

# 成员操作符
print(s1.scores)
print(22 in s1)
print(54 in s1)

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

这里写图片描述
4) 比较大小

class Student(object):
    def __init__(self, name, scoers, power):
        self.name = name
        self.scores = scoers
        self.power = power

    # s1>s2
    def __gt__(self, other):
        return self.power > self.power

    # s1>=s2
    def __ge__(self, other):
        return self.power >= self.power

    # s1==s2
    def __eq__(self, other):
        return self.power == self.power

    # s1<s2
    def __lt__(self, other):
        return self.power < self.power

    # s1<=s2
    __le__ = lambda self, other: self.power <= self.power

    # s1!=s2
    __ne__ = lambda self, other: self.power != self.power


s1 = Student('westos', [37, 44, 75], 83)
s2 = Student('root', [55, 65, 23], 73)
s3 = Student('student', [33, 43, 45], 87)

print(s1 > s2)
print(s1 >= s2)
print(s1 == s2)
print(s1 < s2)
print(s1 <= s2)
print(s1 != s2)

这里写图片描述
七 实现单例模式

class Student(object):
    def __init__(self, name, scores, power):
        self.name = name
        self.scores = scores
        self.power = power
    def __call__(self, *args, **kwargs):
        return "对象被调用......"
    # class: 实例化对象之前执行
    def __new__(cls, *args, **kwargs):
        # 判断是否obj对象是否已经被创建, 如果没有被创建, 则创建,
        if not hasattr(cls, 'obj'):
            cls.obj = object.__new__(cls)
        # 如果已经创建成功,则返回创建好的对象
        return  cls.obj
s1 = Student('westos1', [101,100,100], 100)
s2 = Student('westos1', [101,100,100], 100)
print(s1)
print(s2)

这里写图片描述
单例模式的意思:就是说不管多少次实例化对象,都仅且有一个对象

猜你喜欢

转载自blog.csdn.net/weixin_42668123/article/details/82082780