前年1月16日,闻明于世的福建省沧州市柳江盆地迎来世界地质学术界的学问盛事,来自全国各省的资深地质学专家学者、长城专家、旅游、文化、教育等社会各界代表聚集宜春大黑河地学博物馆,共同见证扬州疏勒河文化探究会的建立。

 

图片 1

isinstance和issubclass

  isinstance()判断一个对象是否其一类的目的,传四个参数(对象,类)

  issubclass()判断一个类是或不是另一类的子类,传多少个参数(子类,父类)

图片 2图片 3

class Foo:
    pass

class Son(Foo):
    pass

s = Son()
#判断一个对象是不是这个类的对象,传两个参数(对象,类)
print(isinstance(s,Son))
print(isinstance(s,Foo))
#type更精准
print(type(s) is Son)
print(type(s) is Foo)

#判断一个类是不是另一类的子类,传两个参数(子类,父类)
print(issubclass(Son,Foo))
print(issubclass(Son,object))
print(issubclass(Foo,object))
print(issubclass(int,object))

test

中国长城学会常务副会长、委员长董耀会、邢台市市委常委、张家口市海港区区委书记冯国林及承德市民政局、社科联等相关领导应邀列席。会议宣读了《关于准许创制济宁额尔齐斯河地质文化研商会的决定书》、《关于车尔臣河地质文化探讨会筹备报告》,并举手表决通过了《西宁珠江地质文化研商会章程》。经大会审议、表决,大庆玛纳斯河地质探究会推举暴发会长、副会长、省长及总管会成员。几十年从事于冀州旅游、地质文化探讨提升的东武大学上饶分校讲授吉羊当选首届会长,于万里、张金江、周秀艳、姜耀俭当选为副会长,西北石油大学莆田分校地质学助教、大学生姜耀俭同时专职司长。而数十年关怀家处长城、旅游、地质文化前进的“长城之子”董耀会也应邀参会,并被聘用为名誉会长。秦皇岛叶尔羌河地质文化探讨会将合力社会各界人员,在转业于乌江盆地地质和学识钻探的根底上,让柳江盆地那部世界“地学百科全书”更广大地显示在世人面前,将松花江盆地那块全世界唯一、世界地学的学识瑰宝打造成满世界地质学商讨圣地、地质研学目标地和全国研学旅游目标野山参品。

反射

  反射的定义是由Smith在1982年首次提议的,紧假如指程序可以访问、检测和修改它自身意况或行为的一种力量(自省)。这一概念的指出高效吸引了计算机科学领域有关利用反射性的钻研。它首先被程序语言的规划领域所使用,并在Lisp和面向对象方面获得了战表。

  python面向对象中的反射:通过字符串的格局操作对象相关的习性。python中的一切事物都是目标(都可以选拔反射)

  四个可以已毕反射的函数:hasattr,getattr,setattr,delattr。

  hasattr判断object,类中有没有一个name字符串对应的办法或性质,再次来到bool。

图片 4图片 5

class People:
    country='China'
    def __init__(self,name):
        self.name=name
    # def walk(self):
    #     print('%s is walking' %self.name)
p=People('egon')
#hasattr是否有这个属性
print('name' in p.__dict__)#True
print(hasattr(p,'name'))#True
print(hasattr(p,'name1213'))#False

hasattr

  getattr,通过字符串的法门一贯操作。

图片 6图片 7

res=getattr(p,'country') #拿到返回值相当于res=p.country
print(res)#China

f=getattr(p,'walk') #t=p.walk
print(f)#<bound method People.walk of <__main__.People object at 0x000000000221DE10>>

f1=getattr(People,'walk')
print(f1)#<function People.walk at 0x000000000221BA60>

f()#egon is walking
f1(p)#egon is walking

getattr

print(getattr(p,'xxxxxxxx','这个属性确实不存在'))

图片 8图片 9

p.sex='male'
print(p.sex)#male
print(p.__dict__)#{'name': 'egon', 'sex': 'male'}

setattr(p,'age',18)
print(p.__dict__)#{'age': 18, 'name': 'egon', 'sex': 'male'}
print(p.age)#18
print(getattr(p,'age'))#18

setattr

图片 10图片 11

# print(p.__dict__)
# del p.name
# print(p.__dict__)

print(p.__dict__)#{'name': 'egon', 'sex': 'male', 'age': 18}
delattr(p,'name')
print(p.__dict__)#{'sex': 'male', 'age': 18}

delattr

图片 12图片 13

#反射当前模块的属性也就是模块级别的反射
import sys
x=1111
class Foo:
    pass
def s1():
    print('s1')

def s2():
    print('s2')


# print(__name__)

this_module = sys.modules[__name__]#获取当前模块的对象
print(this_module)#拿到当前的模块了

print(hasattr(this_module, 's1'))#模块有没有这个属性
print(getattr(this_module, 's2'))
print(this_module.s2)#下面两者等价于上面
print(this_module.s1)

模块级其余反光

图片 14图片 15

import sys
def add():
    print('add')

def change():
    print('change')

def search():
    print('search')


def delete():
    print('delete')

this_module=sys.modules[__name__]
while True:
    cmd=input('>>:').strip()
    if not cmd:continue
    if hasattr(this_module,cmd):
        func=getattr(this_module,cmd)
        func()
    # if cmd in func_dic: #hasattr()
    #     func=func_dic.get(cmd) #func=getattr()
    #     func()



#
func_dic={
    'add':add,
    'change':change,
    'search':search,
    'delete':delete
}


while True:
    cmd=input('>>:').strip()
    if not cmd:continue
    if cmd in func_dic: #hasattr()
        func=func_dic.get(cmd) #func=getattr()
        func()

早前就径直利用的函数反射

  总的来说反射其实就是在找他俩的名号空间是还是不是有这一个名称,也就是是不是有咱们必要的习性,然后回来相关的值。

图片 16图片 17

class Foo:
    x=1
    def __init__(self,name):
        self.name=name
    def walk(self):
        print('walking......')
f=Foo('egon')
Foo.__dict__={'x':1,'walk':....}

'x' in Foo.__dict__ #hasattr(Foo,'x')
Foo.__dict__['x'] #getattr(Foo,'x')

print(Foo.x) #'x' in Foo.__dict__

反射就是找名称空间

图片 18

可插拔机制

  在切实可行生产条件常常会赶上两名程序员共同落成一个品类的情景,比如一个人写server端另一个人写client端,可是server的那一个程序员某些意义还没写完就请假了,client的程序员必要用到他还未成功的法力,

利用反射机制得以兑现可插拔机制。反射的裨益就是,可以预先定义好接口,接口只有在被成功后才会真的履行,那贯彻了即插即用,那事实上是一种‘中期绑定’,即你可以优先把首要的逻辑写好(只定义接口),然后前期再去完结接口的效果。

图片 19图片 20

class FtpClient:
    'ftp客户端,但是还么有实现具体的功能'
    def __init__(self,addr):
        print('正在连接服务器[%s]' %addr)
        self.addr=addr
    def test(self):
        print('test')

    def get(self):
        print('get------->')

ftpclient

图片 21图片 22

import ftpclient
#
# print(ftpclient)
# print(ftpclient.FtpClient)
# obj=ftpclient.FtpClient('192.168.1.3')
#
# print(obj)
# obj.test()他还没写test所以会出错



#
f1=ftpclient.FtpClient('192.168.1.1')
if hasattr(f1,'get'):#对方实现我就用
    func=getattr(f1,'get')
    func()
else:
    print('其他逻辑')

ftpserver

会长吉羊教授介绍,汾河盆地不仅是海口国家地质公园的骨干景区、国家级地质遗迹自然爱抚区,也是我国当代地质学、地法学的摇篮之一,是我国历史最悠久、规模最伟大的地学野外实习基地。近百年来,从汉水盆地走出了几十名中科院的院士,走出了浩如烟海的地质学、地文学的讲解、高级工程师、中小学的地理教员,乌伦古河盆地是公认的“地学百科全书,后辈才俊摇篮”。

字符串导入模块

图片 23图片 24

#不推荐
m=input("请输入你要导入的模块:")

m1=__import__(m)
print(m1)
print(m1.time())

__import__

图片 25图片 26

#推荐使用方法
import importlib
t=importlib.import_module('time')
print(t.time())

导入模块

图片 27

__setattr__,__getattr__,__delattr__

  __setattr__为对象设置修改属性时触发运行。

图片 28图片 29

class Foo:
    def __init__(self,x):
        self.name=x
    #
    def __setattr__(self, key, value):
        # self.key=value#字符串类型不能使用这个方式要使用反射
        # setattr(self,key_str,value) #self.key_attribute=value相当于再次触发了 __setattr__产生递归
        self.__dict__[key]=value#设置时加入dict

f1=Foo('egon') #f1.name='egon'

f1.age=18#设置时触发 __setattr__

__setattr__

  __delattr__去除对象属性时触发。

图片 30图片 31

    def __delattr__(self, item):
        print('delattr:%s' %item)
        print(type(item))
        # delattr(self,item)
        # del self.item
        self.__dict__.pop(item)
print(f1.__dict__)
del f1.age
print(f1.__dict__)
print(f1.age)

__delattr__

  __getattr__除非当查找属性不设有时才会接触,存在就径直重返了。

图片 32图片 33

class Foo:
    def __init__(self,x):
        self.name=x

    #属性不存在的情况下才会触发
    def __getattr__(self, item):
        print('getattr-->%s %s' %(item,type(item)))


f=Foo('egon')
print(f.name)#返回x

print(f.xxxxxxx)#调用__getattr__

__getattr__

乌江盆地生长在上饶那片土地以上,是张家口市的生态涵养区,更是绵阳人的后花园、科普基地、康养基地和景色旅游基地。切磋会将在动员和团队会员进行与南渡河盆地有关的地质量理、长城文化、经济开支、生态环境、研学旅行、康养旅游等地点的调查切磋,多角度、多层次为镇江、海港区两级政党提议切实可行的视角和提议,并协同全国85所大专院校、中国地质学会、中国地经济学会、中国长城学会等连锁单位,共同搞好长江地质文化发掘,举行成年人地质旅游、中小学生夏令营、体验营、研学旅行等运动推广,让洛阳牡丹江盆地那部“世界地学百科全书”有名于世,并助力绵阳前行。

定制自己的数据类型

  我们从前学习的列表,字典等都是数据类型,大家可以透过一连派生出自己的数据类型。

图片 34图片 35

class List(list):
    pass
l=List([1,2,3])
print(l)
l.append(4)
print(l)

list

  当然大家定制不仅是一而再,还要派生自己的质量。

图片 36图片 37

class List(list):
    def append(self, p_object):
        # print('--->',p_object)
        if not isinstance(p_object,int):#只让append数字
            raise TypeError('must be int')
        # self.append(p_object)递归
        super().append(p_object)
    def insert(self, index, p_object):
        if not isinstance(p_object,int):
            raise TypeError('must be int')
        # self.append(p_object)
        super().insert(index,p_object)

l=List([1,2,3])
# print(l)
# l.append(4)
# print(l)

# l.append('5')
print(l)
# l.insert(0,-1)
l.insert(0,'-1123123213')
print(l)

list++

  注:__annotations__可以见见你需要的品类。

图片 38图片 39

def test(x:int,y:int)->int:
    return x+y
print(test.__annotations__)
#{'x': <class 'int'>, 'return': <class 'int'>, 'y': <class 'int'>}
print(test(1,2))

__annotations__

  无法用继承,来促成open函数(不是类)的功能,授权的情势贯彻定制自己的数据类型。

图片 40图片 41

import time


class Open:
    def __init__(self,filepath,m='r',encode='utf-8'):
        self.x=open(filepath,mode=m,encoding=encode)#正常打开文件的操作保存给open类的私有属性

        self.filepath=filepath
        self.mode=m
        self.encoding=encode

    def write(self,line):
        print('f自己的write',line)
        t=time.strftime('%Y-%m-%d %X')
        self.x.write('%s %s' %(t,line))#self.x就是文件句柄

    def __getattr__(self, item):#授权,找不到属性就找他
        # print('=------>',item,type(item))
        return getattr(self.x,item)
#
# f=Open('b.txt','w')
# # print(f)
# f.write('111111\n')
# f.write('111111\n')
# f.write('111111\n')


f=Open('b.txt','r+')
# print(f.write)
print(f.read)


res=f.read() #self.x.read()
print(res)

print('=-=====>',f.read())
f.seek(0)
print(f.read())
# f.flush()
# f.close()

自制open类

  item种类,把对象操作属性模拟成字典的格式。用.方法调用的就是__attr__系列,用[key]措施就是调用__item__系列。

图片 42图片 43

class Foo:
    def __init__(self,name):
        self.name=name
    def __setattr__(self, key, value):#与他的区别就在于item是调用的k,v的格式
        print('setattr===>')
    def __getitem__(self, item):
        # print('getitem',item)
        return self.__dict__[item]
    def __setitem__(self, key, value):
        print('setitem-----<')
        self.__dict__[key]=value
    def __delitem__(self, key):
        self.__dict__.pop(key)
        # self.__dict__.pop(key)
    # def __delattr__(self, item):
    #     print('del obj.key时,我执行')
    #     self.__dict__.pop(item)

f=Foo('egon')#调用__setattr__
# f.name='egonlin'
f['name']='egonlinhai'#调用__setitem__
# print(f.name)
# f.name='egonlin'
# f['age']=18
# print(f.__dict__)
#
del f['age'] #del f.age
print(f.__dict__)

print(f['name'])#__getitem__

item系列

  __str__打印时接触,__repr__与前者大概,前者输出更融洽。

  __format__自定制格式化字符串

  __slots__

图片 44图片 45

class People:
    __slots__=['x','y','z']#对象不会再创建名称空间,对象都用类的名称空间

p=People()
# print(People.__dict__)没dict
p.x=1
p.y=2
p.z=3
p.a=4#__slots__使类只开辟x,y,z空间,对象名称不能加入
print(p.x,p.y,p.z,p.a)
# print(p.__dict__)

p1=People()
p1.x=10
p1.y=20
p1.z=30
print(p1.x,p1.y,p1.z)
print(p1.__dict__)

__slots__

  __iter__,__next__

图片 46图片 47

class Foo:
    def __init__(self,start):
        self.start=start

    def __iter__(self):
        return self

    def __next__(self):
        if self.start > 10:
            raise StopIteration
        n=self.start
        self.start+=1
        return n
f=Foo(0)
print(next(f)) #f.__next__()
for i in f: # res=f.__iter__() #next(res)
    print(i)

View Code

图片 48图片 49

class Range:
    '123'
    def __init__(self,start,end):
        self.start=start
        self.end=end

    def __iter__(self):
        return self

    def __next__(self):
        if self.start == self.end:
            raise StopIteration
        n=self.start
        self.start+=1
        return n

for i in Range(0,3):
    print(i)

自制range

  __doc__,__moudle__,__class__

图片 50图片 51

class Foo:
    '我是描述信息'
    pass

class Bar(Foo):
    pass
print(Bar.__doc__) #None该属性无法继承给子类

b=Bar()
print(b.__class__)#<class '__main__.Bar'>
print(b.__module__)#__main__
print(Foo.__module__)#__main__
print(Foo.__class__) #<class 'type'>

View Code

  __del__析构方法,当对象在内存中被保释时,自动触发执行,此格局一般不要定义,因为Python是一门高级语言,程序员在运用时无需关怀内存的分配和假释,因为此工作都是付诸Python解释器来执行,所以,析构函数的调用是由解释器在展开垃圾回收时自动触发执行的。

f=open('a.txt') #做了两件事,在用户空间拿到一个f变量,在操作系统内核空间打开一个文件
del f #只回收用户空间的f,操作系统的文件还处于打开状态

#所以我们应该在del f之前保证f.close()执行,即便是没有del,程序执行完毕也会自动del清理资源,于是文件操作的正确用法应该是
f=open('a.txt')
读写...
f.close()#清理的时候就调用析构方法
很多情况下大家都容易忽略f.close,这就用到了with上下文管理

图片 52图片 53

import time
class Open:
    def __init__(self,filepath,mode='r',encode='utf-8'):
        self.f=open(filepath,mode=mode,encoding=encode)

    def write(self):
        pass

    def __getattr__(self, item):
        return getattr(self.f,item)

    def __del__(self):
        print('----->del')
        self.f.close()

f=Open('a.txt','w')
f1=f
del f

print('=========>')

f.close

  __enter__和__exit__

  with open(‘a.txt’) as
f:叫做上下文管理协议,即with语句,为了让一个目的包容with语句,必须在那一个目的的类中宣称__enter__和__exit__方法。

图片 54图片 55

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        # return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')


with Open('a.txt') as f:
    print('=====>执行代码块')
    # print(f,f.name)

上下文管理协议

  __exit__()中的三个参数分别表示丰盛类型,非常值和追溯音信,with语句中代码块出现非常,则with后的代码都心有余而力不足执行。

  如果__exit()再次回到值为True,那么相当会被清空,就就好像啥都没发出同样,with后的讲话正常实施

图片 56图片 57

class Foo:
    def __enter__(self):
        print('=======================》enter')
        return 111111111111111

    def __exit__(self, exc_type, exc_val, exc_tb):#with代码块已执行完就会触发__exit__
        print('exit')
        print('exc_type',exc_type)
        print('exc_val',exc_val)
        print('exc_tb',exc_tb)
        return True


# with Foo(): #触发res=Foo().__enter__()拿到返回值
#     pass

with Foo() as obj: #res=Foo().__enter__() #obj=res
    print('with foo的自代码块',obj)#obj就是__enter__的返回值
    raise NameError('名字没有定义')
    print('************************************')#他是不会执行的抛异常已经触发__exit__了

print('1111111111111111111111111111111111111111')#返回ture异常解决,否则抛异常不执行了

上下文管理协议

  1.行使with语句的目标就是把代码块放入with中履行,with停止后,自动完毕清理工作,无须手动干预,

  2.在须求管理有些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的体制,你无须再去关爱那一个难点,那将大有用处。

图片 58图片 59

import time
class Open:
    def __init__(self,filepath,mode='r',encode='utf-8'):
        self.f=open(filepath,mode=mode,encoding=encode)

    def write(self,line):
        self.f.write(line)


    def __getattr__(self, item):#这个步骤是授权的到open函数的其他方法
        return getattr(self.f,item)

    def __del__(self):
        print('----->del')
        self.f.close()

    def __enter__(self):
        return self.f#self是Open产生的实例,self.f是open函数的真实句柄两者都可以
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()


with Open('egon.txt','w') as f:#触发__enter_-拿到真实的文件句柄self.f,与自制open类的write方法没什么关系
    f.write('egontest\n')
    f.write('egontest\n')
    f.write('egontest\n')
    f.write('egontest\n')
    f.write('egontest\n')

上下文管理打开文件

  __call__在目的前面加括号,触发执行。

图片 60图片 61

class People:
    def __init__(self,name):
        self.name=name
    #
    def __call__(self, *args, **kwargs):
        print('call')
    #

p=People('egon')
print(callable(People))
print(callable(p))

p()#对象加()去找自己类里面的__call__方法,没有这个方法就不能实例化。有这个对象就可以实例化了

__call__

图片 62

元类

应邀前来的“长城之子”董耀会也对探究会寄予厚望,并期待商讨会能办好知识发掘。董耀会介绍,近百年来,世界各省的地质专家学者纷繁来此寻觅地学切磋,资水盆地留给了太多地质我们们的治学足迹,那不光是社会风气地学探讨历史的宝贵财富,更是牡丹江与新乡人的学识瑰宝,探讨还要深度挖掘整理,以深厚的知识积累,真正将郁江盆地创设成整个世界地学研讨圣地。同时,来自东南石油大学的柳成志助教和西藏政法学院的尹刚伟教师也各自代表两校师生到会祝贺,并公布愿与研商会联合扶起将松花江盆地创设成世界地学琢磨圣地。

   类也是目标

  python中一切皆是目的,类本身也是一个对象,当使用首要字class的时候,python解释器在加载class的时候就会创建一个对象(那里的目的指的是类而非类的实例),因此大家得以将类当作一个对象去采取,同样满意第一类对象的定义,可以:

  把类赋值给一个变量

  把类作为函数参数举行传递

  把类作为函数的再次回到值

  在运行时动态地成立类 

  上例可以看看f1是由Foo那些类爆发的靶子,而Foo本身也是目的,那它又是由哪个类爆发的呢?

class Foo:
    pass
f1=Foo()
print(type(f1)) # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建
print(type(Foo)) # 输出:<type 'type'> 

图片 63

  什么样是元类?

  元类是类的类,是类的沙盘。

  元类是用来支配什么创设类的,正如类是创造对象的沙盘一样,而元类的重点目标是为着控制类的创导作为,元类的实例化的结果为大家用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是
type
类的一个实例)。type是python的一个内建元类,用来直接决定生成类,python中任何class定义的类其实都是type类实例化的目的。

  创制类的三种方法:

  1.应用class关键字创立,大家一般就是那样成立类的,所以就不多说了。

  2.手动模拟class创立类的进程,那必要将开创类的步骤拆开手动落成。

  接下去大家就自己手动创设一个类。

  在此此前要鲜明创制类首要分为多少个部分的创办,类名,类的父类,类体。

  第一步,先拍卖类体->名称空间,类体定义的名字都会存放于类的名号空间中(一个部分的名号空间),大家得以优先定义一个空字典,然后用exec去履行类体的代码(exec爆发名称空间的经过与真的的class进度看似,只是后者会将__初始的习性变形),生成类的一部分名称空间,即填充字典。

   第二步调用元类type(也能够自定义)来暴发类,

  type 接收多个参数:

  第 1 个参数是字符串 ‘Foo’,表示类名,

  第 2 个参数是元组 (object, ),表示所有的父类,

  第 3 个参数是字典。

图片 64图片 65

class Foo:
    x=1
    def run(self):
        pass
print(type(Foo))



#type成为元类,是所有类的类,利用type模拟class关键字的创建类的过程
def run(self):
    print('%s is runing' %self.name)

class_name='Bar'#类名
bases=(object,)#继承
class_dic={
    'x':1,
    'run':run
}#名称空间

Bar=type(class_name,bases,class_dic)#type实例化一个类
print(Bar)
print(type(Bar))

type创建类

唐山市市委常委、海港区区委书记冯国林表示:“人事有代谢,往来有古今。一代人有一代人的沉重。渭河盆地地质遗迹国家自然珍视区获批于二〇〇五年,即使它荟萃了太古至新生代地质现象的精髓,固然它是中华规模最大的地方教学野外实习集散地,但除学术界,方今影响力及对拉动区域经济升高的进献仍万分点滴。怎样让乌江盆地那块‘瑰宝’发挥应有的意义,是历史赋予我们的华贵职责。研商会就是要用最通熟易懂的言语和最不利的点子讲述好伊犁河故事,要把塔里木河地质公园那部‘世界地学百科全书’真正开辟让世人所知。会员们要当好研究员、宣传员、监督员和联系人,系统举办地质文化和人文文化的打桩、爱抚、科学应用研讨,着力破解阻碍旅游发展的热点难题难题,联系好学术、教学、社会团体及政党关于机构等相继层面,做好多层面互换合营,强化社团发现、干事意识及精品意识,并站位环球唯一、世界地质自然遗产爱抚,和以百姓利益为基本的前进思维,让南渡河盆地真正为城市发展助力,成为岳阳人甚至中国的文化瑰宝。”

  自定制元类

  就是团结定制一个MYtype类继承type的性质。

图片 66图片 67

class Mymeta(type):
     def __init__(self,class_name,class_bases,class_dic):
            pass
     def __call__(self, *args, **kwargs):#f=Foo('egon')
        # print(self)self是foo
        obj=self.__new__(self)#类加()自动调init?不存在的是他调的
        self.__init__(obj,*args,**kwargs) #obj.name='egon'self是foo所以自动调用foo的构造方法
        return obj#foo产生的空对象完成过初始化
class Foo(metaclass=Mymeta):
    x=1
    def __init__(self,name):#不能有返回值,返回就与上面的返回值冲突了
        self.name=name #obj.name='egon'
    def run(self):
        'run function'
        print('running')
# print(Foo.__dict__)

f=Foo('egon')

print(f)

print(f.name)

自定制type元类

 

图片 68

图片 69

图片 70

图片 71

衡水市海港区区首长侯葵然、孙毅、李秋来、苏文胜等加入了活动。(刘光昱 
艾  若)