Python无类再理解--metaclass,type

上次理解过一次,时间久了,就忘了。。

再学习一次。。

http://blog.jobbole.com/21351/

=======================

但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:

  

将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:

1)   你可以将它赋值给一个变量

2)   你可以拷贝它

3)   你可以为它增加属性

4)   你可以将它作为函数参数进行传递

=======================

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class ObjectCreator(object):
    pass

print ObjectCreator

def echo(o):
    print o

echo(ObjectCreator)
print hasattr(ObjectCreator, 'new_attribute')
ObjectCreator.new_attribute = 'foo'
print hasattr(ObjectCreator, 'new_attribute')
print ObjectCreator.new_attribute
ObjectCreatorMirror = ObjectCreator
print ObjectCreatorMirror
print ObjectCreatorMirror()

def choose_class(name):
    if name == 'foo':
        class Foo(object):
            pass
        return Foo
    else:
        class Bar(object):
            pass
        return Bar
MyClass = choose_class('foo')
print MyClass
print MyClass()

print type(1)
print type("1")
print type(ObjectCreator)
print type(ObjectCreator())

MyShinyClass = type('MyShinyClass', (), {})
print MyShinyClass
print MyShinyClass()

Foo = type('Foo', (), {'bar': True})
print Foo
print Foo.bar
f = Foo()
print f
print f.bar

def echo_bar(self):
    print self.bar

FooChild = type('FooChild', (Foo,),{'echo_bar': echo_bar})
print FooChild
print FooChild.bar

print hasattr(Foo, 'echo_bar')
print hasattr(FooChild, 'echo_bar')

my_foo = FooChild()
my_foo.echo_bar()

age = 35
print age.__class__
print age.__class__.__class__
name = 'bob'
print name.__class__
print name.__class__.__class__
def foo(): pass
print foo.__class__
print foo.__class__.__class__
class Bar(object): pass
print Bar.__class__
print Bar.__class__.__class__
b = Bar()
print b.__class__
print b.__class__.__class__

时间: 2025-01-26 09:07:41

Python无类再理解--metaclass,type的相关文章

对象-关于python元类遇到的问题(TypeError: metaclass conflict)?

问题描述 关于python元类遇到的问题(TypeError: metaclass conflict)? from abc import ABCMeta class test1(object):metaclass = ABCMeta def test1(self): print 'test1' class UpperAttrMetaclass(type): def new(cls, name, bases, dct={}): a = super(UpperAttrMetaclass, cls).

学习设计模式之初,面向对象再理解

要开始大话设计模式的学习了,看这本书的封面,感觉很轻松,很卡通,很有趣.一本新书怎么去读,怎么去学,老师讲过很多次了. 一本书的前言是相当重要,它能帮助我们掌握全局,它也可能会给予我们一些指导.读完前言,我便知道自己下一步该做什么了. 下一个脚步--面向对象再理解. 关于面向对象,在学习C#的时候有了初步总结,但感觉很多概念理解得都不是很深刻.所以,在学习设计模式之初,很有必要再次进行总结. 从设计模式这本书中,故事性.提问性.交谈性的编写方式,读起来的感觉真的不太一样,没有那么枯燥,硬邦邦的感

对于Python中RawString的理解介绍_python

总结 1.'''作用: 可以表示 "多行注释" ."多行字符串" ."其内的单双引号不转义" 2.r 代表的意思是: raw 3.r 只对其内的反斜杠起作用(注意单个 \ 的问题) raw string 有什么用处呢? raw string 就是会自动将反斜杠转义. >>> print('\n') >>> print(r'\n') \n >>> (注:出现了两个空行是因为 print() 会自

对三层构架的再理解

问题描述 三层结构中是不是不应该在UI和BLL中出现sql语句?1.如果在UI中有条件查询,怎么避免在BLL中出现拼sql语句的情况?2.如果要使用事务操作多个dal方法,怎么避免对dal修改? 解决方案 解决方案二:绝对不应该在BLLUI中出现sql所以你第一个问题是不存在的,BLL只负责定义条件查询的函数.而且是静态的.BLL调用DAL的函数.之后拼sql是DAL的事.第二个问题其实不管DAL的事,是数据库处于并发数据的问题.解决方案三:有时间"再理解",不如花点时间"理

Python栈类实例分析

 本文实例讲述了python栈类.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Path: #a list used like a stack def __init__(self): self.P = [] def push(self,t): self.P.append(t) def pop(self): return self.P.pop() def top(self): return self.P[-1] def r

python实现类的静态变量用法

  这篇文章主要介绍了python实现类的静态变量用法,实例分析了Python中基于数组实现静态队列的相关使用技巧,需要的朋友可以参考下 这里使用静态变量目的是在类中实现一个静态的队列,这里用数组实现,任何时候插入到队列中的数据不会和类的实例有直接关系. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 __author__ = 'Administrator' class CaptchaImage: def queue(self,arr=list()): return arr de

python自定义类并使用的方法

  这篇文章主要介绍了python自定义类并使用的方法,涉及Python中类的定义与使用技巧,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Person: def __init__(self, first, middle, last, age): self.first = first; self.middle = middle; self.last = last; self.age = age; def __str

pyobject-c++调用python 无结果返回问题,求教!

问题描述 c++调用python 无结果返回问题,求教! 问题描述:程序执行至调用函数前都没有错误,但返回的结果为空,即pReturn为空.想请教各位这是什么原因?另外,在释放python对象指针代码处,VS2010编译报错(之前灰掉这块了):" 无法解析的外部符号 imp_Py_Dealloc,该符号在函数 main 中被引用1>TT.obj : error LNK2019: 无法解析的外部符号 __imp__Py_NegativeRefcount,该符号在函数 main 中被引用1&g

数据-百度地图坐标类和理解类问题

问题描述 百度地图坐标类和理解类问题 问题 1.:new BMap.Map(""allmap""{minZoom:8maxZoom:16}) 中的 allmap 是不是特定的: 为什么改过之后就出不来地图?请教 2.: 我想做一个根据中心点 方圆500米 的距离 显示数据库中已有数据的 坐标 解决方案 那个是你容器的id,你要显示在哪个容器就设置哪个容器的id,不是特定的,注意你的js代码要放在dom对象下或者domready事件中,防止找不到对象 你解码得到中心点