这篇文章给大家分享的是有关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 <diesch@spamfence.net>]
# [SNIPPET_LICENSE: MIT]
# Copyright 2010 Florian Diesch <diesch@spamfence.net>
# 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 <prop>"""
return '_%s'%prop
def create_property(cls, name, default):
""" creates a property named <name> with default value <default>"""
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 <prop>"""
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 <prop>"""
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
感谢各位的阅读!关于“python怎么创建和使用一个简单的元类”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。