面向对象进阶——内置方法

Posted 休耕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象进阶——内置方法相关的知识,希望对你有一定的参考价值。

七、__setitem__, __getitem__, __delitem__

  item系列

class Foo:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        # print(‘getitem...‘)
        #print(item)

        return self.__dict__.get(item)  # 字典get方法有则取值,无也不会报错

    def __setitem__(self, key, value):
        # print(‘setitem...‘)
        # print(key,value)
        self.__dict__[key] = value

    def __delitem__(self, key):
        # print(‘delitem...‘)
        # print(key)
        # self.__dict__.pop(key)
        del self.__dict__[key]

obj = Foo(egon)


# 1、查看属性
# obj.属性名
# item系列就是为了把对象模拟成像字典一样,就可以像字典一样访问
obj[name]   # 以这种形式完成 obj.name取值的效果
"""
getitem...
name
"""
print(obj[name])

# 2、设置属性
# obj.sex = ‘male‘
obj[sex] = male

print(obj.__dict__)
print(obj.sex)

# 3、删除属性
# del obj.name
del obj[name]
print(obj.__dict__)
"""
{‘sex‘: ‘male‘}
"""

 

八、__str__, __repr__,  __format__

  改变对象的字符串显示__str__,__repr__
  自定制格式化字符串__format__

技术分享图片
d = dict({name : egon})
print(isinstance(d, dict))  # True,d是dict类的实例
print(d)

class Foo:
    pass
obj = Foo()
print(obj)
""" 同样是打印对象,显示形式完全不同,打印总是希望像前一种有提示功能。
{‘name‘: ‘egon‘}
<__main__.Foo object at 0x10401ad68>
"""

# __str__方法定义后,会在打印对象的时候,触发这个对象下的__str__方法,把字符串的结果作为打印的结果
class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):  # 必须return一个字符串
        # print("触发__str__方法:")
        return <name:%s,age:%s> %(self.name, self.age)


obj = People(egon, 18)
print(obj)
"""
<name:egon,age:18>
"""
细究__str__
技术分享图片
format_dict={
    nat:{obj.name}-{obj.addr}-{obj.type},#学校名-学校地址-学校类型
    tna:{obj.type}:{obj.name}:{obj.addr},#学校类型:学校名:学校地址
    tan:{obj.type}/{obj.addr}/{obj.name},#学校类型/学校地址/学校名
}
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type

    def __repr__(self):
        return School(%s,%s) %(self.name,self.addr)
    def __str__(self):
        return (%s,%s) %(self.name,self.addr)

    def __format__(self, format_spec):
        # if format_spec
        if not format_spec or format_spec not in format_dict:
            format_spec=nat
        fmt=format_dict[format_spec]
        return fmt.format(obj=self)

s1=School(oldboy1,北京,私立)
print(from repr: ,repr(s1))
print(from str: ,str(s1))
print(s1)

‘‘‘
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘‘‘
print(format(s1,nat))
print(format(s1,tna))
print(format(s1,tan))
print(format(s1,asfdasdffd))
学校类
技术分享图片
date_dic={
    ymd:{0.year}:{0.month}:{0.day},
    dmy:{0.day}/{0.month}/{0.year},
    mdy:{0.month}-{0.day}-{0.year},
}
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

    def __format__(self, format_spec):
        if not format_spec or format_spec not in date_dic:
            format_spec=ymd
        fmt=date_dic[format_spec]
        return fmt.format(self)

d1=Date(2016,12,29)
print(format(d1))
print({:mdy}.format(d1))
自定义format练习
技术分享图片
class A:
    pass

class B(A):
    pass

print(issubclass(B,A)) #B是A的子类,返回True

a1=A()
print(isinstance(a1,A)) #a1是A的实例
issubclass和isinstance

 

九、slots

 


以上是关于面向对象进阶——内置方法的主要内容,如果未能解决你的问题,请参考以下文章

面向对象进阶——内置方法

铁乐学python_day24_面向对象进阶1_内置方法

Python之路(第二十七篇) 面向对象进阶:内置方法描述符

面向对象进阶:反射以及内置方法

Python之路(第二十六篇) 面向对象进阶:内置方法

Python基础-第七天-面向对象编程进阶和Socket编程简介