Python_day_08_魔术方法

原创 2018年04月16日 14:10:52

1._format魔术方法

_formats = {
    'ymd': '{d.year}-{d.month}-{d.day}',
    'mdy': '{d.month}/{d.day}-{d.year}',
    'dmy': '{d.day}/{d.month}/{d.year}',

}
class Date(object):
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __format__(self, code):
        if code == '':
            code = 'ymd'
        fmt = _formats[code]
        return fmt.format(d=self)

d = Date(2018, 1, 9)

print format(d, 'ymd')
print format(d, 'mdy')
print format(d, 'dmy')

# __format__    format(d)


# format(d, 'ymd')  === "2018-01-09"

2._切片魔术方法

from collections import Iterable

class Student(object):
    def __init__(self, name):
        self.name = name
        self.score = [100, 90, 89]

    # 判断一个类的对象是否可以迭代, 看类是否有__iter__方法
    # 自己定义迭代的规则;
    def __iter__(self):
        return iter(self.score)

    def __eq__(self, other):
        avg_score1 = sum(self.score)/len(self.score)
        avg_score2 = sum(other.score)/len(other.score)
        return  avg_score1 == avg_score2

    def __le__(self, other):
        pass

    def __ge__(self, other):
        pass

    def __getitem__(self, item):
        # 访问某个属性时, s['key']
        pass

    def __setitem__(self, key, value):
        # 给某个属性赋值使用; s['key']=value
        print key, value

    def __delitem__(self, key):
        pass

s1 = Student('fentiao')
s2 = Student('fendai')
# print isinstance(s1, Iterable)
# for i in s1:
#     print i
#
# print s1 ==  s2
# print s1 >  s2

print s1[1:2]

3._切片魔术方法

from collections import Iterable


class Student(object):
    def __init__(self, name):
        self.name = name
        self.score = [100, 90, 89, 100, 89]

    def __getslice__(self,i, j):
        return  self.score[i:j]

    def __setslice__(self, i, j, item):
        self.score[i:j] = item


    def __delslice__(self, i, j):
        del self.score[i:j]


s1 = Student('fentiao')
print s1[1:4]
s1[1:4]=[0, 0, 0]
print  s1[1:5]

s1[1:4]= [100, 90, 80]

del s1[0:3]

print s1[0:5]

4._字符串显示之format

# format通过位置符号
print "{0:.2f}:{1:d}:{0}".format(1,2)

# format使用名称
print "max:{max}\n\nmin:{min}".format(min=10, max=100)

# 通过属性

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({d.name}, {d.author}, {d.state})".format(d=self)

b = Book('a','a', 1, 'IN9008')
print b

5. 格式化元组的具体项

point = (1,3)

print 'X:{0[0]};Y:{0[1]}'.format(point)

goods = [
    ("001", 'computer', 100, 4000),
    ("002", 'apple', 1000, 4),
    ("003", 'xiaomi', 100, 3000),
]

formatter = "编号:{0[0]}\t 名称:{0[1]}\t数量:{0[2]}\t价格:{0[3]}".format
for i in map(formatter,goods):
    print i

6._getitem魔术方法

from collections import Iterable

class Student(object):
    def __init__(self, name):
        self.name = name
        self.score = [100, 90, 89]

    def __getitem__(self, item):
        # 访问某个属性时, s['key']
        return self.__dict__[item]

    def __setitem__(self, key, value):
        # 给某个属性赋值使用; s['key']=value
        # print key, value
        if isinstance(key, str):
            try:
                node = self.__dict__[key]
            except:
                self.__dict__[key] = value
        self.__dict__[key] = value

    def __delitem__(self, key):
        pass

s  = Student('fentiao')
print s.__dict__
s['key'] = 'value'
s['hello'] = 'a1'
s['key1'] = 'value2'
print s['key1']

15个常用魔术方法

__construct() __destruct() __call() __callStatic() __get() __set() __isset() __unset() __sle...
  • hackvo
  • hackvo
  • 2016-09-05 22:46:34
  • 706

PHP中十六个魔术方法详解

PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括: 更多资料请访问:http://www.chinarobo...
  • xiaochao199404
  • xiaochao199404
  • 2016-12-04 19:56:33
  • 234

PHP中的常见魔术方法功能作用及用法实例

概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利。PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发。这篇文章简单...
  • a2534725767
  • a2534725767
  • 2017-02-15 12:57:30
  • 5592

15个魔术方法的总结

PHP5中魔术方法函数有哪几个,请举例说明各自的用法   __wakeup   __construct, __destruct __call,__get, __set, __isset, __un...
  • xiaoxiaohui520134
  • xiaoxiaohui520134
  • 2016-10-14 15:42:26
  • 1454

PHP 魔术方法之"__set()"和"__get"

__set()方法: 这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。 这个方法同样不用我们手工去调用,它也可以做成私有...
  • u013372487
  • u013372487
  • 2015-07-02 10:36:29
  • 439

飘逸的python - 什么是魔术方法(magic method)

我们经常看到各种被双下划线环绕的方法,如__init__,它们就是魔术方法. 魔术方法是python语言预定好的"协议",不同魔术方法在不同场景下,会被隐式调用.我们通过重载这些方法,从而操控各种行...
  • u010180339
  • u010180339
  • 2014-10-17 15:24:01
  • 2483

总结2: PHP中的魔术方法及其应用场景

PHP中有一类特别的系统方法,它们统一以__开头,使用语义清晰简单,这类形式特殊、作用特殊的方法被称为魔术方法。常见的魔术方法有__construct()、__destruct()、__call()、...
  • hyh1123176978
  • hyh1123176978
  • 2016-11-11 18:18:06
  • 486

PHP中用魔术方法__autoload()实现类的自动加载

将一个独立的、完整的类保存到一个PHP页中,并且文件名和类名保持一致,这时每一个开发人员都需要养成的良好习惯。当引用多个类时使用include_once()和require_once()函数将类一个个...
  • manbujingxin
  • manbujingxin
  • 2011-07-31 19:54:49
  • 3477

面向对象之魔术方法__get()和__set()

__get()方法:这个方法用来获取私有成员和保护成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是...
  • pan_xi_yi
  • pan_xi_yi
  • 2016-05-13 08:47:44
  • 1742
收藏助手
不良信息举报
您举报文章:Python_day_08_魔术方法
举报原因:
原因补充:

(最多只允许输入30个字)