python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码

在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途。

#!/usr/bin/env python

# [SNIPPET_NAME: Simple metaclass]

# [SNIPPET_CATEGORIES: Python Core]

# [SNIPPET_DESCRIPTION: Shows how to create a and use a simple metaclass]

# [SNIPPET_AUTHOR: Florian Diesch ]

# [SNIPPET_LICENSE: MIT]

# Copyright 2010 Florian Diesch

# All rights reserved.

#

# Permission is hereby granted, free of charge, to any person obtaining a copy

# of this software and associated documentation files (the "Software"), to deal

# in the Software without restriction, including without limitation the rights

# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

# copies of the Software, and to permit persons to whom the Software is

# furnished to do so, subject to the following conditions:

#

# The above copyright notice and this permission notice shall be included in

# all copies or substantial portions of the Software.

#

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

# THE SOFTWARE.

#

class PropertyMetaclass(type):

"""

This metaclass expects its instances to have a class attribute

__properties__ that is a dict mapping property names to their

default values. The metaclass creates the corresponding

properties

"""

def __init__(cls, name, bases, dict):

type.__init__(cls, name, bases, dict)

props = getattr(cls, '__properties__', {})

for name, default in props.iteritems():

type(cls).create_property(cls, name, default)

def attr_name(cls, prop):

""" returns the attribute name for property """

return '_%s'%prop

def create_property(cls, name, default):

""" creates a property named with default value """

getter=cls.create_getter(name)

setter=cls.create_setter(name)

prop=property(getter, setter, None, None)

# that's the attribute holding the actual value

setattr(cls, cls.attr_name(name), default)

# that's the property

setattr(cls, name, prop)

def create_getter(cls, prop):

""" creates a getter method for property """

attr=cls.attr_name(prop)

def getter(self):

print " class %s: get %s"%(cls.__name__, prop)

return getattr(self, attr)

return getter

def create_setter(cls, prop):

""" creates a setter method for property """

attr=cls.attr_name(prop)

def setter(self, value):

print " class %s: set %s to '%s'"%(cls.__name__, prop, value)

setattr(self, attr, value)

return setter

class Book(object):

__metaclass__= PropertyMetaclass # use the metaclass

__properties__ = { # some properties

'author': '[unknown title]',

'title': '[unknown author]'

}

if __name__ == '__main__':

book = Book()

print '%s by %s'%(book.title, book.author)

book.author = 'Euclid'

book.title = 'Elements'

print '%s by %s'%(book.title, book.author)

# prints:

#

# class Book: get title

# class Book: get author

# --unknown author-- by --unknown title--

# class Book: set author to 'Euclid'

# class Book: set title to 'Elements'

# class Book: get title

# class Book: get author

# Elements by Euclid

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值