改变 Python 对象规则的黑魔法 Metaclass

今天小明哥要分享的主题是:改变类定义的神器-metaclass

看到标题,你可能会想改变类的定义有什么用呢?什么时候才需要使用metaclass呢?

今天我将带大家设计一个简单的orm框架,并简单剖析一下YAML这个序列化工具的原理。

Python类的上帝-type

说到metaclass,我们首先必须清楚一个最基础的概念就是对象是类的实例,而类是type的实例,重复一遍:

  1. 对象是类的实例
  2. 类是type的实例

在面向对象的编程模型中,类就相当于一个房子的设计图纸,而对象则是根据这个设计图纸建出来的房子。

下图中,玩具模型就可以代表一个类,而具体生产出来的玩具就可以代表一个对象:

改变 Python 对象规则的黑魔法 Metaclass

总之,类就是创建对象的模板。

而type又是创建类的模板,那么我们就可以通过type创建自己想要的类。

比如定义一个 Hello 的 class:

class Hello(object):
    def hello(self, name='world'):
     print('Hello, %s.' % name)

当 Python 解释器载入 hello 模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个 Hello 的 class对象。

type()函数既可以查看一个类型或变量的类型,也可以根据参数创建出新的类型,比如上面那段类的定义本质上就是:

def hello(self, name='world'):
    print('Hello, %s.' % name)
Hello = type('Hello', (object,), dict(hello=hello))

type()函数创建class 对象,依次传入 3 个参数:

  • class 类的名称;

  • 继承的父类集合,注意 Python 支持多重继承,如果只有一个父类,别忘了 tuple 的单元素写法;

  • class 的方法名称与函数绑定以及字段名称与对应的值,这里我们把函数 fn 绑定到方法名 hello 上。

通过 type() 函数创建的类和直接写 class 是完全一样的,因为 Python 解释器遇到 class 定义时,仅仅是扫描一下class 定义的语法,然后调用 type() 函数创建出 class。

正常情况下,我们肯定都是用 class Xxx… 来定义类,但是type() 函数允许我们动态创建出类来,这意味着Python这门动态语言支持运行期动态创建类。你可能感受不到这有多强大,要知道想在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现,本质上都是动态编译,会非常复杂。

metaclass到底是什么

那type和metaclass有什么关系呢?metaclass到底是什么呢?

我认为metaclass 其实就是type或type的子类,通过继承type,重载__call__运算符,便可以在class类对象创建时作出一些修改。

对于类 MyClass:

class MyClass():
 pass

其实相当于:

class MyClass(metaclass = type):
 pass

一旦我们把它的 metaclass 设置成 MyMeta:

class MyClass(metaclass = MyMeta):
 pass

MyClass 就不再由原生的 type 创建,而是会调用 MyMeta 的__call__运算符重载。

class = type(classname, superclasses, attributedict) 
## 变为了
class = MyMeta(classname, superclasses, attributedict)

对于具有继承关系的类:

class Foo(Bar):
 pass

Python做了如下的操作:

  • Foo中有__metaclass__这个属性吗?如果是,Python会通过__metaclass__创建一个名字为Foo的类(对象)
  • 如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。
  • 如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。
  • 如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

假想一个很傻的例子,你决定在你的模块里所有的类的属性都应该是大写形式。有好几种方法可以办到,但其中一种就是通过在模块级别设定__metaclass__:

class UpperAttrMetaClass(type):
    ## __new__ 是在__init__之前被调用的特殊方法
    ## __new__是用来创建对象并返回之的方法
    ## 而__init__只是用来将传入的参数初始化给对象
    ## 你很少用到__new__,除非你希望能够控制对象的创建
    ## 这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__
    ## 如果你希望的话,你也可以在__init__中做些事情
    ## 还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用
    def __new__(cls, future_class_name, future_class_parents, future_class_attr):
        ##遍历属性字典,把不是__开头的属性名字变为大写
        newAttr = {}
        for name,value in future_class_attr.items():
            if not name.startswith("__"):
                newAttr[name.upper()] = value

        ## 方法1:通过'type'来做类对象的创建
        ## return type(future_class_name, future_class_parents, newAttr)

        ## 方法2:复用type.__new__方法,这就是基本的OOP编程
        ## return type.__new__(cls, future_class_name, future_class_parents, newAttr)

        ## 方法3:使用super方法
        return super(UpperAttrMetaClass, cls).__new__(cls, future_class_name, future_class_parents, newAttr)


class Foo(object, metaclass = UpperAttrMetaClass):
    bar = 'bip'

print(hasattr(Foo, 'bar'))
## 输出: False
print(hasattr(Foo, 'BAR'))
## 输出:True

f = Foo()
print(f.BAR)
## 输出:'bip'

简易ORM框架的设计

ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。

现在设计一下ORM框架的调用接口,比如用户想通过User类来操作对应的数据库表User,我们期待他写出这样的代码:

class User(Model):
    ## 定义类的属性到列的映射:
    id = IntegerField('id')
    name = StringField('username')
    email = StringField('email')
    password = StringField('password')

## 创建一个实例:
u = User(id=12345, name='xiaoxiaoming', email='test@orm.org', password='my-pwd')
## 保存到数据库:
u.save()

上面的接口通过常规方法很难或几乎很难实现,但通过metaclass就会相对比较简单。核心思想就是通过metaclass修改类的定义,将类的所有Field类型的属性,用一个额外的字典去保存,然后从原定义中删除。对于User创建对象时传入的参数(id=12345, name=’xiaoxiaoming’等)可以模仿字典的实现或直接继承dict类保存起来。

其中,父类Model和属性类型StringFieldIntegerField是由ORM框架提供的,剩下的魔术方法比如save()全部由metaclass自动完成。虽然metaclass的编写会比较复杂,但ORM的使用者用起来却异常简单。

首先定义Field类,它负责保存数据库表的字段名和字段类型:

class Field(object):

    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type

    def __str__(self):
        return '<%s:%s>' % (self.__class__.__name__, self.name)

在Field的基础上,进一步定义各种类型的Field,比如StringField,IntegerField等等:

class StringField(Field):

    def __init__(self, name):
        super(StringField, self).__init__(name, 'varchar(100)')

class IntegerField(Field):

    def __init__(self, name):
        super(IntegerField, self).__init__(name, 'bigint')

下一步,编写ModelMetaclass:

class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        if name == 'Model':
            return type.__new__(cls, name, bases, attrs)
        print('Found model: %s' % name)
        mappings = dict()
        for k, v in attrs.items():
            if isinstance(v, Field):
                print('Found mapping: %s ==> %s' % (k, v))
                mappings[k] = v
        for k in mappings.keys():
            attrs.pop(k)
        attrs['__mappings__'] = mappings  ## 保存属性和列的映射关系
        attrs.setdefault('__table__', name) ## 当未定义__table__属性时,表名直接使用类名
        return type.__new__(cls, name, bases, attrs)

以及基类Model:

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v.name)
            params.append('?')
            args.append(getattr(self, k, None))
        sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))
        print('SQL: %s' % sql)
        print('ARGS: %s' % str(args))

ModelMetaclass中,一共做了几件事情:

  1. 在当前类(比如User)中查找定义的类的所有属性,如果找到一个Field属性,就把它保存到一个__mappings__的dict中,同时从类属性中删除该Field属性(避免实例的属性遮盖类的同名属性);
  2. 当类中未定义__table__字段时,直接将类名保存到__table__字段中作为表名。

Model类中,就可以定义各种操作数据库的方法,比如save()delete()find()update等等。

我们实现了save()方法,把一个实例保存到数据库中。因为有表名,属性到字段的映射和属性值的集合,就可以构造出INSERT语句。

测试:

u = User(id=12345, name='xiaoxiaoming', email='test@orm.org', password='my-pwd')
u.save()

输出如下:

Found model: User
Found mapping: id ==> <IntegerField:id>
Found mapping: name ==> <StringField:username>
Found mapping: email ==> <StringField:email>
Found mapping: password ==> <StringField:password>
SQL: insert into User (id,username,email,password) values (?,?,?,?)
ARGS: [12345, 'xiaoxiaoming''test@orm.org''my-pwd']

测试2:

class Blog(Model):
    __table__ = 'blogs'
    id = IntegerField('id')
    user_id = StringField('user_id')
    user_name = StringField('user_name')
    name = StringField('user_name')
    summary = StringField('summary')
    content = StringField('content')


b = Blog(id=12345, user_id='user_id1', user_name='xxm', name='orm框架的基本运行机制', summary="简单讲述一下orm框架的基本运行机制",
         content="此处省略一万字...")
b.save()

输出:

Found model: Blog
Found mapping: id ==> <IntegerField:id>
Found mapping: user_id ==> <StringField:user_id>
Found mapping: user_name ==> <StringField:user_name>
Found mapping: name ==> <StringField:user_name>
Found mapping: summary ==> <StringField:summary>
Found mapping: content ==> <StringField:content>
SQL: insert into blogs (id,user_id,user_name,user_name,summary,content) values (?,?,?,?,?,?)
ARGS: [12345, 'user_id1''xxm''orm框架的基本运行机制''简单讲述一下orm框架的基本运行机制''此处省略一万字...']

可以看到,save()方法已经打印出了可执行的SQL语句,以及参数列表,只需要真正连接到数据库,执行该SQL语句,就可以完成真正的功能。

YAML序列化工具的实现原理浅析

YAML是一个家喻户晓的 Python 工具,可以方便地序列化 / 逆序列化结构数据。

官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation

安装:

pip install pyyaml

YAMLObject 的任意子类支持序列化和反序列化(serialization & deserialization)。比如说下面这段代码:

import yaml


class Monster(yaml.YAMLObject):
    yaml_tag = '!Monster'

    def __init__(self, name, hp, ac, attacks):
        self.name = name
        self.hp = hp
        self.ac = ac
        self.attacks = attacks

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self.name}, hp={self.hp}, ac={self.ac}, attacks={self.attacks})"


monster1 = yaml.load("""
--- !Monster
name: Cave spider
hp: [2,6]
ac: 16
attacks: [BITE, HURT]
""")
print(monster1, type(monster1))

monster2 = Monster(name='Cave lizard', hp=[36], ac=16, attacks=['BITE''HURT'])
print(yaml.dump(monster2))

运行结果:

Monster(name=Cave spider, hp=[2, 6], ac=16, attacks=['BITE''HURT']) <class '__main__.Monster'>
!Monster
ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

这里面调用统一的 yaml.load(),就能把任意一个 yaml 序列载入成一个 Python Object;而调用统一的 yaml.dump(),就能把一个 YAMLObject 子类序列化。

对于 load() 和 dump() 的使用者来说,他们完全不需要提前知道任何类型信息,这让超动态配置编程成了可能。比方说,在一个智能语音助手的大型项目中,我们有 1 万个语音对话场景,每一个场景都是不同团队开发的。作为智能语音助手的核心团队成员,我不可能去了解每个子场景的实现细节。

在动态配置实验不同场景时,经常是今天我要实验场景 A 和 B 的配置,明天实验 B 和 C 的配置,光配置文件就有几万行量级,工作量不可谓不小。而应用这样的动态配置理念,就可以让引擎根据配置文件,动态加载所需要的 Python 类。

对于 YAML 的使用者也很方便,只要简单地继承 yaml.YAMLObject,就能让你的 Python Object 具有序列化和逆序列化能力。

据说即使是在大厂 Google 的 Python 开发者,发现能深入解释 YAML 这种设计模式优点的人,大概只有 10%。而能知道类似 YAML 的这种动态序列化 / 逆序列化功能正是用 metaclass 实现的人,可能只有 1% 了。而能够将YAML 怎样用 metaclass 实现动态序列化 / 逆序列化功能讲出一二的可能只有 0.1%了。

对于YAMLObject 的 load和dump() 功能,简单来说,我们需要一个全局的注册器,让 YAML 知道,序列化文本中的!Monster需要载入成 Monster 这个 Python 类型,Monster 这个 Python 类型需要被序列化为!Monster标签开头的字符串。

一个很自然的想法就是,那我们建立一个全局变量叫 registry,把所有需要逆序列化的 YAMLObject,都注册进去。比如下面这样:

registry = {}
 
def add_constructor(target_class):
    registry[target_class.yaml_tag] = target_class

然后,在 Monster 类定义后面加上下面这行代码:

add_constructor(Monster)

这样的缺点很明显,对于 YAML 的使用者来说,每一个 YAML 的可逆序列化的类 Foo 定义后,都需要加上一句话add_constructor(Foo)。这无疑给开发者增加了麻烦,也更容易出错,毕竟开发者很容易忘了这一点。

更优雅的实现方式自然是通过metaclass 解决了这个问题,YAML 的源码正是这样实现的:

class YAMLObjectMetaclass(type):
    def __init__(cls, name, bases, kwds):
        super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds)
        if 'yaml_tag' in kwds and kwds['yaml_tag'is not None:
            cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
            cls.yaml_dumper.add_representer(cls, cls.to_yaml)
    ## 省略其余定义
 
class YAMLObject(metaclass=YAMLObjectMetaclass):
    yaml_loader = Loader
    yaml_dumper = Dumper
    ## 省略其余定义

可以看到,YAMLObject 把 metaclass 声明成了 YAMLObjectMetaclass,YAMLObjectMetaclass则会改变YAMLObject类和其子类的定义,就是下面这行代码将YAMLObject 的子类加入到了yaml的两个全局注册表中:

cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
cls.yaml_dumper.add_representer(cls, cls.to_yaml)

YAML 应用 metaclass,拦截了所有 YAMLObject 子类的定义。也就是说,在你定义任何 YAMLObject 子类时,Python 会强行插入运行上面这段代码,把我们之前想要的add_constructor(Foo)add_representer(Foo)给自动加上。所以 YAML 的使用者,无需自己去手写add_constructor(Foo)add_representer(Foo)

总结

这次分享主要是简单的浅析了 metaclass 的实现机制。通过实现一个orm框架并解读 YAML 的源码,相信你已经对metaclass 有了不错的理解。

metaclass 是 Python 黑魔法级别的语言特性,它可以改变类创建时的行为,这种强大的功能使用起来务必小心。

看完本文,你觉得装饰器和 metaclass 有什么区别呢?欢迎下方留言和我讨论。记得一键三连呦,笔芯!

改变 Python 对象规则的黑魔法 Metaclass

转自:https://mp.weixin.qq.com/s/Ls2UP7Zh4f4dIrf38IVDQA

上海的保供名单里,怎么出现了那么多垃圾企业?!

首先声明:暴露的问题越多,不仅不丢人,反而是一种进步

 

就如同,欧美国家的民众抗议全球第一。

 

真正可怕的,不是暴露问题,而是静悄悄!

 

1
特供名单

上海的劣质保供物资,情况愈演愈烈,已经造成重大的舆论影响

 

为勇敢的上海人点赞!!

上海的保供名单里,怎么出现了那么多垃圾企业?!

这些劣质物质,大都是保供企业提供的。

 

保供企业,是上海政府指定的特许经营企业,专门负责上海的物资供应和配送。企业名单是公开可查询的,公布在上海商务委员会的官方公众号“上海商务”。

 

上海的保供名单里,怎么出现了那么多垃圾企业?!

上海的保供名单里,怎么出现了那么多垃圾企业?!

保供企业一共1070家,分成了7个种类,我只查询了“餐饮企业”和“零售药品流通”这两个门类。

 

从三个维度考察基本情况:

1、实缴资本是不是0?

2、参保人员是不是0?

3、经营资质许可证有没有过期?

本来还想查一查司法诉讼情况,但个人精力有限,就舍掉了。

所谓“三无”企业:无资金、无人员、无资质。满足前两个条件的任何一个,就可以说是空壳公司或皮包公司;存在第三个条件,那就是无良企业。

总之,都在垃圾企业之列。

 

不查不知道,一查吓一跳。

 

2
餐饮企业

“餐饮企业”一共268家。那些熟悉的、有名的企业,比如百盛、棒约翰、金拱门,我们直接略过,只查那些名字听都没听过、名字很奇怪的企业

 

第一个被我抓到的是,上海荷源餐饮管理有限公司

 

实缴资本是0,参保人员只有4人。

 

上海的保供名单里,怎么出现了那么多垃圾企业?!

食品经营许可证的有效期是2019年10月,已经过期两年半了

上海的保供名单里,怎么出现了那么多垃圾企业?!

还有更刷新下限的,这家企业从2016年成立开始,作为被告的司法案件就没断过,现在股权还被冻结着

你很难找到比它还差的企业!

 

这样的企业生产出来的餐饮食品,跟投毒会有本质区别吗?

 

上海有料餐饮管理有限责任公司,实缴资本是0,参保人员只有4人。

上海瀛佳餐饮管理有限公司,不存在食品经营许可证过不过期的问题,因为它压根就没办这个证,参保人员只有1人。

上海鼎颢餐饮有限公司,参保人员0,食品经营许可证已经过期。

最搞笑的是,上海沪恩膳餐饮管理有限公司,这名字起得多么感天动地,意思是给上海施恩,但是它做得最过分:

实缴资本0,参保人员0,从来没有办理食品经营许可证。

 

上海顺好餐饮管理有限公司,实缴资本0;

 

上海潾源餐饮服务有限公司,实缴资本0

我这查了大概20家企业,就已经有7家“中奖”的,概率超过了1/3!

后面我不查了,大家自己去翻吧,就是只要你觉得公司名字从没见过听过的,一查就容易出点问题。

我还发现个神奇的事情,上海丰裕餐饮管理有限公司鲁班路分公司,实缴资本和参保人员都是0;但上海丰裕餐饮管理有限公司看起来还算正常。这就奇了怪了:

 

你不采用信誉更好、实力更强的母公司,偏偏要选一个问题重重的分公司!

 

有受虐症吗?

3
药企

药企一共73家。

 

第一个被我抓到的,上海泉源堂智慧药房有限公司。去年才成立,实缴资本和参保人员都是0.

上海的保供名单里,怎么出现了那么多垃圾企业?!

上海真仁堂药业有限公司,实缴资本0,药品经营许可证已经过期1年。

 

上海海吉雅医药有限公司,实缴资本0。

上海仁携大药房连锁有限公司,实缴资本和参保人员都是0。

上海高济智慧药房有限公司,实缴资本和参保人员都是0。

急尼优智慧药房(上海)有限公司,实缴资本和参保人员都是0。

上海众缘健大药房连锁有限公司,实缴资本0。

保供的药企情况比餐饮行业要好一点,但这毕竟是药企啊。

劣质食品与劣质药品,对身体的危害哪个更大?

 

73家药企如果从头到尾查一遍,我估计会有20家左右存在问题。

 

4
黑心企业

有这么多问题企业来保供,居民收到的物资怎么可能没问题呢?

我在上海,今天早上一起床,就发现朋友圈有很多人在晒伪劣物资。

仿佛有人组织,大家一起商量好似的。

我随便截几个图给大家看看。

 

上面那位是某券商的首席研究,下面是某金融机构的富二代女。

上海的保供名单里,怎么出现了那么多垃圾企业?!

某大律所的合伙人:

 

上海的保供名单里,怎么出现了那么多垃圾企业?!

连这些有钱人都中枪,就不用说其他人了。

 

最令我感到惊讶的是,浦东洋泾街道也“遭迫

上海的保供名单里,怎么出现了那么多垃圾企业?!

洋泾街道在哪里?黄浦江边、紧挨着陆家嘴,绝对寸土寸金的黄金地带!连洋泾街道收到的物资都不忍直视,何况是其他地区?!

上海的保供名单里,怎么出现了那么多垃圾企业?!

上海假劣物资的触目惊心,我点到即止,现在新闻陆陆续续报道出来,大家可以自行网上搜索。

 

上海不缺好物资,这从辽宁省委针对上海的辟谣中就可以看出来;

 

上海不缺好配送,这从京东的“自杀式物流”就可以看出来;

 

保供名单里也不缺好企业,京东、沃尔玛、永辉、美团……。

 

但是,那些伪劣物资是怎么送到上海的千家万户呢?

 

啥也不说了,用诺贝尔经济学奖获得者米塞斯的一句话作为结尾吧:

如果在撒哈拉沙漠里实行计划经济,沙子都会短缺。

 

上海的保供名单里,怎么出现了那么多垃圾企业?!

转自:https://mp.weixin.qq.com/s/6JlLw1nhvFzxnaBAw9yWhg

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

来源/无相财经(ID:wuxiangcj

大鱼吃小鱼,小鱼吃虾米,这是生物圈的法则。
而现在的上海,出现了三种人。
吃人的小虾米,吃人的食人鱼,吃人的大白鲨。
他们是怎么“吃人“的?今天就对最近上海的魔幻新闻,做个总结。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

第一种吃人的,是在疫情中利用居民出不了小区,买不了菜的窘境恶意提价的人。
前几天,一位在上海的小姑娘可能是饿坏了,找了骑手买了20个鸡蛋和6桶方便面。
谁曾想骑手小哥狮子大开口,要价900元。
其中包括代买费570元和跑腿费330元。而两人之前商定的价格,仅仅是270元。
20个鸡蛋加6桶方便面,平日里,不会超过70块钱吧?
270元的价格,姑娘认了,但没想到,“小虾米“愣是能抬到900元!
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
女孩提出要看小票,表示不相信,骑手说没有,女孩又慌又怕,报了警。
警察了解情况后,问骑手,票呢?
骑手支支吾吾说本来就没小票,警察一番仗义执言,怼得骑手说不出话来。
之后骑手恼羞成怒,说不送了,并想要跑腿费。
这时,警察则要求他提供工作证件,男子拿出假证后,被当场识破,最后将钱返还给了女子,而骑手小哥被传唤带走。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
后来,警方对该骑手进行调查,发现他从疫情爆发以来,就通过平台接单、小区蹲点、朋友介绍等方式,在跑腿费和代买费上宰了不少被封住脚步的客人,非法牟利2万多,现在已对其采取刑事强制措施。
一个没有骑手资质的人,冒充骑手,一单就能赚大几百。
一天呢?上万了吧。
况且这还是被逮到的,那些没被逮到的呢?

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

第二种吃人的,是通过特殊渠道,特殊资源,倒买倒卖,哄抬物价的人。
昨天,上海警方发布通告,处理了一个倒买倒卖的人。
这个人短短一周就赚了150万!
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
175万的销售额,150万的利润,利率高达600%!
毒贩子看了沉默,高利贷看了流泪。
马克思看了,想修改一下资本论里的说法——当利润达到300%时,甚至连上绞刑架都毫不畏惧。
在马克思看来利润高达300%,资本家就已经不怕死了。
现在这个高某轻轻松松搞了600%,而且还不用死,仅仅是租了别人的食品经营营业执照,就搞了那么多的钱,他当然敢那么干。
值得注意的是,他还只是个人单干,不涉及公司。
那么,其他那些自己有证,有资源的呢,公司化运营的呢?
前几天,上海梅陇镇的乳头肉,就上了热搜。
群众反映,好不容易等来的物资,竟然全是不能吃的乳头肉。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
刚开始,我还有点不相信,觉得这种肉,是流入不到市场的。
因为猪奶头部位有很多腺体,一般是不能吃的,基本当湿垃圾。
检疫总局也规定宰杀分割生猪后,必须对猪乳头进行修割,所以菜市场基本买不到这种肉。
这不活生生残害群众吗? 
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
现在事情水落石出了,有关部门承认,部分猪肉确实存在质量问题,并启动相关调查问责程序”。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
按照官方的说明,是镇政府的供应商动了手脚,把协议约定的五花肉(2斤)、蹄髈(1斤)换成了猪废料。
镇政府把相关企业已被列入黑名单,换新的供应商。
那么问题来了:
1、梅陇镇是怎么做事前准备的,难道不去走访企业,不详细审核,就随意签合同了?
2、供应商的选择采用的是什么办法,有没有按照程序招标?
昨天,事情水落石出了。
上海警方查明,闵行区梅陇镇政府出资760万元招标买猪肉,结果中标公司用300万元去买劣质猪肉,一下子净赚460万!
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币! 
而上海梅陇镇两干部也因为劣质猪肉事件被免职。
其中一个是副镇长,一个是经发办主任。
没有背景的食人鱼小口吃人,有背景有关系的食人鱼大口吃人!
通常而言,保供单位的选择,一般都要找有货源、有能力、信誉好的大企业。
在上海,为什么有那么多的皮包公司,成了保供单位?

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

几十万、几百万,以上这些,还都是赚的小钱。
接下来,我想谈谈挣得多的,大白鲨级别的。
我们知道,在这次上海的疫情中,一些以京东为代表的大物流公司,在送货的路上,屡遭物业、卡口刁难。
说不是保供单位,不让送。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
运货司机,有时候也是有去无回。以至于大量的菜都烂掉,都送不到居民手里。
是谁在阻碍物流,阻碍这些援助上海的物资?
为什么老百姓很难抢到平价菜,而涨了价的高价菜就很容易买到?

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!

上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
再次,我之前说过,倒买倒卖、哄抬物价,相对而言只能说是小财。
大财是什么?
前两天,王思聪怒怼连花清瘟,冲上热搜。
4月12日,云南紧急拨付了6600万援助上海疫情,其中1600万采购物资,1000万元采购蔬菜。
其余的4000万元都是用来采购中成药……说实话,我不是很理解这波操作。
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
这几天,我看到最多的新闻,就是在上海这座城市,有人拿着疫情当提款机,拿人民当人民币!
上海封控20天了。
这20天,有多少人在忍受高价的食物。忍受发不出工资,和收不到工资的窘境。
很多人被迫无奈,靠网贷活命。
也许,病毒不是最致命的,无限恶意的资本才是最致命的。
最近一个月,他们张着血盆大口,大快朵颐。
而今天,上海已经开始对这些人挨个调查,绳之以法。
我希望,这波重拳应该更猛烈一些,一定要严厉打击上述利用疫情发财的人和企业!
如此,上海才有信心,上海才有希望!
END
上海奸商正被清算:他们拿疫情当提款机,拿人民当人民币!
转自:https://mp.weixin.qq.com/s/2SLf3NOOOCKmxPu1kdD1ww

上海的第六波精彩来了

从昨天晚上到今天下午,一天的时间不到,上海又涌现了更多精彩故事,这些故事来自不同的社区,不同的街道,在不同的人身上发生着,于是上演了一幕幕悲欢离合,让人看得心潮起伏,久久不能平息。

 

作为一个写字者,我又要把这些精彩的故事,用自己的方式记录下来,然后让你们大家看到。

 

昨天最精彩的故事,就是上海和辽宁那事,不少网友表示好奇,为什么辽宁会把证据做得那么严谨,等于是全程预料到了上海方面的反应。

 

今天中午十二点半左右,终于有网友揭开了这个内幕:辽宁的副省长来自上海。

 

上海的第六波精彩来了

 

网友忍不住评价辽宁这一波干得很漂亮。

 

上海的第六波精彩来了

 

 

这个副省长叫周波,来自上海奉贤金汇镇,2019年去的辽宁。

 

上海的第六波精彩来了

 

听了这个内幕后,网友都表示恍然大悟,什么叫知己知彼,这就是了,更逗的是,吉林今天也支援上海了,这次是大米,不走高速,直接走铁路。

 

上海的第六波精彩来了

 

但还是有网友发现了这个,不免令人叹息。

 

上海的第六波精彩来了

 

说到底,都是为了能让上海普通市民吃饱饭,并吃好,而这两天时间,上海普通网友为了一口吃的,真的是操碎了心,比如这个,里面没有菜。

 

上海的第六波精彩来了

 

至于肉,就这一点。

 

上海的第六波精彩来了

 

如果说在吃的方面,有比这更难以忍受的事情,那就是各种过期的,或者是没有资质的食品了,可是偏偏在这方面,也玩出各种花样了。

 

比如有网友反映,嘉兴的叫花鸡送到上海时,一扫码就露出马脚了。

 

上海的第六波精彩来了

 

还有网友发现拿到手的油也很奇怪,下午刚生产,晚上就到网友手里了。

 

上海的第六波精彩来了

 

拿到的咸肉也发绿了。

 

上海的第六波精彩来了

 

以上的种种,还是比不过上海桃浦发的午餐肉里长出了这个。

 

上海的第六波精彩来了

 

有鉴于此,从昨天下午开始,上海普通网友们纷纷在开始相互提醒了,说发下来的盐水鸭和油都不合格。

 

上海的第六波精彩来了

 

在食用油方面,网友点了龙金花这个牌子的名。

 

上海的第六波精彩来了

 

这就是网友拿到的龙金花。

 

上海的第六波精彩来了

 

有网友找到了这个盐水鸭的生产厂商被罚款记录。

 

上海的第六波精彩来了

 

结果这些油和盐水鸭发给了身在洋泾的网友。

 

上海的第六波精彩来了

 

这就是洋泾的网友所领到的物资。

 

上海的第六波精彩来了

 

油出了问题,那盐自然也不能避免,已经有居委会火速发出这样的通知。

 

上海的第六波精彩来了

 

结果有的网友已经吃下去了。

 

上海的第六波精彩来了

 

汤臣四期也没有躲过。

 

上海的第六波精彩来了

 

坐拥千万豪宅的人,在这个时候,终究也抵不过门口的一只酱鸭。

 

上海的第六波精彩来了

 

这是网友找到的记录,相关的风险加起来达到一千多项。

 

上海的第六波精彩来了

 

由此,上海洋泾的网友得出这样的结论。

 

上海的第六波精彩来了

 

这是网友对这批物资的总结,不是三无就是超标,要么实缴资本为零,实在很难令人放心。

 

上海的第六波精彩来了

 

不得不说,上海网友们就是精细,连超标的原文都找到了。

 

上海的第六波精彩来了

 

顺便还普及了一把孔雀石绿对人体的危害。

 

上海的第六波精彩来了

 

网友们还找出了相应的处罚通知书。

 

上海的第六波精彩来了

 

还有网友说自己吃榨菜吃出了钢片。

 

上海的第六波精彩来了

 

 

已经有网友因为吃了这样的东西而拉肚子了。

 

上海的第六波精彩来了

 

网友们也很无奈,因为他们所住的整个街道都是这样的,连洗衣液都有问题。

 

上海的第六波精彩来了

 

连抽纸都缩水四分之三了。

 

上海的第六波精彩来了

 

网友很好奇这些东西在淘宝上都买不到,这到底是从哪里采购来的。

 

上海的第六波精彩来了

 

网友由此得出结论,这发下来的都是伪劣产品。

 

上海的第六波精彩来了

 

这些网友都没有一味的抱怨,也没有一味的等待,而是集体去投诉了。

 

上海的第六波精彩来了

 

事实上,已经有网友吃了酱鸭后,拉肚子了。

 

上海的第六波精彩来了

 

于是因为这事,上海多个居民小区都在紧急回收酱鸭。

 

上海的第六波精彩来了

 

这是古桐四村发的通知。

 

上海的第六波精彩来了

 

就是这样的盐水鸭,已经让多个居民小区的网友中招了。

 

上海的第六波精彩来了

 

这是来自网友的呼声。

 

上海的第六波精彩来了

 

发下来的牙膏和沐浴露则无品牌认证。

 

上海的第六波精彩来了

 

其他街道的网友也很操心,他们发现巴西五花肉的生产日期不对号,都变成下个月的了。

 

上海的第六波精彩来了

 

打浦桥发的腊肠也没有生产日期。

 

上海的第六波精彩来了

 

昨天在山东生产的油,今天就到上海了。

 

上海的第六波精彩来了

 

于是有网友说了这样的话,我都能想象得出,说这话的网友脸上满是苦涩的笑。

 

上海的第六波精彩来了

 

于是有网友苦中作乐之下,这样安慰自己。

 

上海的第六波精彩来了

 

正因为吃的方面牵动人心,毕竟想放心的吃一口真的太难了,所以梅陇镇问题猪肉那事也有新的后续了。

 

上海的第六波精彩来了

 

还有网友透露,医用棉签厂家也出现问题了。

 

上海的第六波精彩来了

上海的第六波精彩来了

上海的第六波精彩来了

上海的第六波精彩来了

上海的第六波精彩来了

 

除了吃的和用的之外,现在方舱也上演魔幻故事了,居然有市民不愿出来了,

不愿出来的是这三个原因。

 

上海的第六波精彩来了

 

由此网友得出这样一个结论。

 

上海的第六波精彩来了

 

还有豆瓣网友得出这样一个结论,上海当下最痛苦的不是富人,也不是穷人,而是中产一族,因为他们的选择成本太高。

 

上海的第六波精彩来了

中产一族固然难过,其他群体也未必好过,像这个网友的朋友,就亲身体验了一回。

 

上海的第六波精彩来了

 

还有网友在抖音上爆料,长宁区市容局的副局长走了,也叫不上救护车,也进不了医院急诊。

 

上海的第六波精彩来了

 

当然,普通上海市民被折腾得更惨,凌晨还在睡梦中,就接到消息,大清早就要排队作检测,这是其中一个小区的通知原文。

 

上海的第六波精彩来了

 

这样太折腾人了,也太容易出问题,于是有上海普通市民不乐意了,理由是活儿做得太不细致了。

 

上海的第六波精彩来了

上海的第六波精彩来了

 

90岁的华东师大退休教授也被折腾得心惊胆战,让人不由感叹,老人何辜,亦复何苦……

 

上海的第六波精彩来了

 

面对这样的情况,知名音乐家谭盾也终于发声了。

 

上海的第六波精彩来了

 

普通市民不好过,在上海的生产企业同样也不好过,比如安森美。

 

上海的第六波精彩来了

 

正所谓物极必反,折腾到极点时,昨天下午终于迎来了好消息,虽然不知是否能实现,但至少能让普通市民松口气了。

 

上海的第六波精彩来了

 

由这个消息,昨天晚上七点半左右,又传来一个消息,上海将试行侧卧式放开。

 

上海的第六波精彩来了

为了能在接下来更好的侧卧式放开,上海还推出了一个新举措。

 

上海的第六波精彩来了

 

还有自媒体给出了相应的数据,加起来差不多700万人了。

 

上海的第六波精彩来了

 

这里不得不佩服上海普通市民的心理素质,虽然日子不是很好过,但他们总能发现新的乐趣,比如这个表情的变化。

 

上海的第六波精彩来了

 

有上海网友则这样自嘲。

 

上海的第六波精彩来了

 

还有上海市民在隔离期间,把打火机拆成这个样子,并提出这样的疑问。

 

上海的第六波精彩来了

 

有网友则改编了这个。

 

上海的第六波精彩来了

 

这是来自网友的解读。

 

上海的第六波精彩来了

 

有网友则把英语单词给玩明白了。

 

上海的第六波精彩来了

上海的第六波精彩来了

 

这大概就是传说中的举一反三了。

 

上海的第六波精彩来了

 

其他网友也不甘示弱,把专业名词给玩明白了。

 

上海的第六波精彩来了

上海的第六波精彩来了

 

这就是所谓的学以致用。

 

上海的第六波精彩来了

 

还有网友则玩起了拆字游戏。

 

上海的第六波精彩来了

 

有网友忍不住感叹道。

 

上海的第六波精彩来了

 

当然在日常的求锤得锤环节中,从来不缺乏笑料,这一次轮到了网络大V师伟,他曾经表达过这样的观点。

 

上海的第六波精彩来了

 

结果昨天凌晨,这样的事真的落到他头上了,他瞬间不淡定了。

 

上海的第六波精彩来了

 

到处求人。

 

上海的第六波精彩来了

 

还忍不住说了这样的话。

 

上海的第六波精彩来了

 

于是网友们看到了,很多事情不落在自己的头上,可以很轻松地说话,可要是真落到自己的头上了,亲身经历过体验过,才知道那种滋味,所谓的看人挑担不吃力,自己挑担真费力,大概就是这样的了。

 

不爱讲段子的网友则发现了这样一个事情,在上海十六个区的三十二个书记区长中,上海本地人只占了三个,占比堪堪十分之一。

 

上海的第六波精彩来了

上海的第六波精彩来了

上海的第六波精彩来了

 

另有网友发现了这样一个经典博弈,这真的是太善于观察和思考了。

 

上海的第六波精彩来了

 

还有网友真的忧心如焚,他在上海虹桥看到这样的事。

 

上海的第六波精彩来了

 

当然,除了段子以外,上海普通市民们继续用自己的方式在发光发热,为社会尽到自己的一份力量,有网友自己出钱买了大白服给到小区的志愿者们。

 

上海的第六波精彩来了

 

上海的部分公司也很有良心,给员工发了这样的大礼包,真的很见心意了。

 

上海的第六波精彩来了

 

这份大礼包打开后,就是这样的,真的很能安慰和治愈人了。

 

上海的第六波精彩来了

 

更可贵的是,上海网友不仅有善心,而且还很严谨,这几天他们已经纠正了几个说法,12岁小孩行走50公里经他们测算后,被纠正成为了20公里。

 

还有方舱四个半小时不能上卫生间那事,

 

上海的第六波精彩来了

 

经过上海网友还原后,大概是这样的。

 

上海的第六波精彩来了

 

小区一栋楼出现阳性被拉走,则经上海网友还原后,是这样的,不是这栋楼里的所有人都会拉走。

 

上海的第六波精彩来了

 

还有一个事情也让上海网友澄清了,就是那个海峡对岸的表妹是在杭州拍的照片,然后是因为家里老人病了,所以才回去的,而不是因为其他原因回去的。

 

上海的第六波精彩来了

 

这大概就是上海人们的另一个好处,遇事不慌不急,不盲从,也不走极端,他们只相信事实,而且愿意现有规则内维护自己应有的东西,相当的有章法了。

 

对此,我只能认为,生活上海这座城市的大多数普通市民还是很好的,他们依然在相信着一些东西,依然在坚守着一些东西,并且在实际行动中体现出来。

 

这样的上海普通市民,值得拥有更多的善待和关心。

 

PS:今天在文章的最后,推荐一个很好朋友的号,他人很靠谱,我和他彼此之间也很信任,大家可以关注一下他。

 

 

这个是小晖的~

 

上海的第六波精彩来了

转自:https://mp.weixin.qq.com/s/Mzb9iIio_9VVvJ-Vyrflbw

市场里的钱,多的都要溢出来了!

市场里的钱,多的都要溢出来了!

3月末,为满足广大人民群众的喝酒需求,”i茅台”APP上线试运营。

 

消费者可以在该软件上申购茅台酒,基于茅台酒的升值共识,使得该APP在下载量方面接连几日超越抖音,淘宝等国民级APP,蝉联热门应用榜首。

 

市场叫座叫得贼拉响,不知道是否叫好呢?

 

当天18时平台公布数据

53度500ml贵州茅台酒(壬寅虎年)投放量8934瓶,申购人数220万;

 

53度500ml茅台1935投放量13492瓶,申购人数130万人;

 

53度375ml*2(壬寅虎年)投放量仅376瓶,申购人数120万。

而这种抢购焦灼,此刻还在进行。

 

问题来了,广大人民群众疯狂抢购动辄3000元+的茅台酒,难道个个都是酒鬼?

 

明白人都知道,茅台酒凭借稀缺性与社会共识已成为当下不可或缺的投资品。

 

抢到一瓶,转手一卖,至少净赚1000元,美滋滋。

 

这年头苍蝇肉也是肉,有稳定收益的投资品就是爹。

 

4月7日,今年首单公募Reits — 华夏中国交建,面向公众正式开售。

 

那热销场面,锣鼓喧天,鞭炮齐鸣。

 

据公告显示,该Reits累计吸金超1500亿,0.84%的配售比例,直接刷新了公募基金产品配售比例的历史最低纪录。

 

这里先解释一下,当投资者申购总规模超过产品规定上限时,管理人可以按照投资者提交的申请金额按比例确认基金份额,该比例即是配售比例。

 

而0.84%则意味着,你申购了价值10000元的基金份额,而实际上只能买到84元,剩下的9916元原路退回。

 

该产品性价比怎样暂且不谈,但如此火爆的售卖程度,你能说市场没有钱么?

只要市场上出现相对稳定的投资标的,钱多的能吓死你。

 

 

市场里的钱,多的都要溢出来了!

近几年,在权益市场丰富的结构性行情下,“固收+”这类产品成为投资当红小花旦。

 

依托其进可攻退可守的属性,尤其是进攻带来的收益,表现出了极具吸引力的一面,发行规模也年年攀升,2020年和2021年的累计新发规模达9000亿元。

 

但随着今年这几年一遇的狗屎行情,股债齐跌,”固收+”也没能抗住,跌20个点跟玩一样。

 

偏债混合型基金和二级债基的成立规模去年Q1是1759亿元,而今年直接小腿斩,规模仅仅549亿。

 

机构不想发,发了跌跌不休真坏名声;

 

投资者更不想买,谁闲得蛋疼跟钱过不去呢。

 

固收类的如此,基金整体就更不能看了。

 

wind数据统计显示,2022年Q1公募基金共有386只新基金成立,合计募资2,738亿元,发行规模同比下降74%,因申购不足而发行失败的不在少数。

市场里的钱,多的都要溢出来了!

现在投资者也顿悟了,公募基金就是钝刀子割肉,今天跌一点,明天跌一点,短期不痛不痒。

 

但时间一拉长,20个点没了,才幡然醒悟。

公募基金如此,股票貌似就不用说了,先看个数据。

 

财政部近日数据显示,全国Q1一般公共预算收入62037亿元,同比增长8.6%,重点在下面

 

—— 证券交易印花税1067亿元,同比增长21.3%。

 

1067亿,这份荣耀的背后,却是广大股民抄底割肉的真实写照。

不仅清仓,连新股也不想碰了。

 

4月17日傍晚,新股纳芯微曝出338.15万股被弃购,金额高达近7.8亿元,而本次网上发行总数才872.35万股。

 

其实这真的不怪股民,毕竟谁跟钱过不去呢!

 

今年上市的新股已有6成破发,最惨的翱捷科技最新收盘价比发行价已经跌去近60%。

 

并且首日大破发态势不断延续,动辄一签亏上万。

 

随着大前天深夜某光伏逆变器超级龙头业绩暴雷,业绩风险蔓延直接带崩创业板的同时,直接将定增投资者活埋。

 

去年九月,该上市公司股价在150元时,以128元定向增发,UBS、高盛、小摩、摩根大通银行等国际大鳄积极参与。

 

随着业绩暴雷,目前股价以跌破70元,集体酸爽了。

 

看到这想必大家就明白了,不是市场没钱,而是市场不敢投了

 

只要出现相对稳定的投资标的,钱多的真能吓死你。

而众所周知,金融产业的背后是实体经济。

市场里的钱,多的都要溢出来了!

行情太差,市场风险偏好迅速收缩,全面抛弃风险资产。

 

从”固收+”到偏股基金,从新购申购到定向增发,市场开始用脚投票。

 

抛弃风险的另一面,是全面拥抱稳健。

 

抢茅台还可以理解,连Reits也开始被疯抢,足以说明市场保守到何种地步。

 

今年一季度,我国人民币存款增加10.86万亿元,其中居民存款增加7.82万亿

元。

 

仅3月份,人民币存款就增加了4.49万亿元,按照这个数字来进行计算,

一季度平均每个月存款上涨2.6万亿元,平均每天上涨866亿;

 

按照我国14亿人口计算,那从1月份到3月份,我国人均储蓄5585元;

 

再剔除未成年人,以减少3亿人计算,则达到了7100元;

人们都知道把钱放银行会被通胀吞噬,但最后却只能无奈地存银行,这背后又是何等辛酸。

 

问题来了,市场还缺钱么?

 

—— 不仅不缺钱,而且钱多的都要溢出来了。

 

近日央行降准25基点,这敷衍程度令市场懵逼,但手握货币阀门的央行很清楚。

 

在事后答记者问环节,有关负责人明确表示

 

—— 当前流动性已处于合理充裕水平。

 

降准是给商业银行发钱,而当下银行缺钱么?

 

市场里的钱,多的都要溢出来了!

shibor,是由信用等级较高的银行组成报价团自主报出的人民币同业拆出利率计算确定的算术平均利率。

 

利率越高,说明银行缺钱,市场缺钱;利率越低,则意味着银行不缺钱,市场也不缺钱。

 

而以上数据则表明,当下都不缺钱。

 

投资者由于风险偏高收缩减少投资,而实体经济则由于需求不振缩减产能。

 

市场里的钱,多的都要溢出来了!

一季度末9.7%增速的广义货币M2供给量,而更能显示经济活力的M1货币才4.7%,与之对应的是4.8%的GDP增速……

 

拉,就是硬拉,但效果只能说一般。

 

懂点经济学的人都知道,货币只能起刺激作用,而不能触碰经济的内在本质。

 

受不可抗因素影响,我国Q1只有工业、建筑、房地产三个行业正增长,而农业、交运、批发零售、住宿餐饮、金融和其他服务业这6大行业的GDP增速仍在下降通道中。

 

而以生产端利润作为收入来源的居民消费端,此时就可想而知

 

市场里的钱,多的都要溢出来了!

以前我们说过,在极端天气时,小动物们都倾向于躲进山洞避险,待到天晴再选择外出觅食。

 

而此时的我们所面临的消费投资表现,何尝不是如何。

随着消费与出口端预期下滑,大多数市场主体在宽松环境下依然选择先避险。

 

他们知道,融资扩产时确实很爽,但产出来总归是要卖出去的呀!

 

环顾四周心茫然,始终不知货予谁。

当下场根本不缺钱,缺的是信心,缺的是担当。

 

中小企业想借,或用于生产,或用于续命熬过这场暴风雨。

 

—— 但由于缺乏信用背书与资产抵押,银行要么不借,要么高息。

 

银行知道,中小企业在高PPI成本下,加上疫情的骚扰与消费不振,它们随时有倒闭的风险,站在自身角度看没错。

 

这些企业的员工们也都知道,又被裁的风险反而不敢消费了,转身放进银行,站在自身角度看也没错,那到底谁错了?

这题,难解!

 

转自:https://mp.weixin.qq.com/s/hjRYqmppwiHLsY-m_kelfw