lg04551

导航

 

一、补充

isinstance 检查是否obj、是否是类 cls 的对象

issubclass检查sub类是否是 super 类的派生类

 

二、反射弧

通过字符串来操作类与对象的属性,这种操作称为反射

hasatter  判断object中有没有一个name字符串对应的方法或属性

getatter 获取obj中有没有一个name 字符串如果没有的话就返回一个 none

setatter给 obj 中的一个属性添加一个值

delatter删除obj中的一个属性

class People:

  def __init__(self,name,age):

    self.name=name

    self.age=age

obj=People('aa',10)

print(hasatter(People,'name'))

print(getattr(obj,'name'))

setatter(People,'name','bb')

print(People.__dict__)

print(People,'age')

print(obj.__dict__)

输入运行命令执行该命令

class Foo:

  def run(self):

    while True:

      cmd=input('cmd>>:').strip()

      if hasattr(self,cmd):

        func=getattr(self,cmd)

        func()

   def download(slelf):

    print('download.....')

   def upload(self):

    print('upload...')

obj=Foo()

obj.run()


 

三、__str__

class People:

  def __init__(self,name,age,sex):

    self.name=name

    self.age=age

    self.sex=sex

  def __str__(self):

    return(‘名字:%s 年龄:%s 性别:%s’)%(self.name,self.age,self.sex)

obj=People('egon',18,'male')

print(obj)

四、__del__

import time

class People:

  def __init__(self,name,age,sex):

    self.name=name

    self.age=age

    self.sex=sex

  def __del__(self):#在对象被删除的条件下,自动执行

    print('__del__')

obj=People('egon',18,'male')

del obj

time.sleep(5)


五、元类

1、exce用法

code='''

x=1

y=2

def f1(self,a,b):

  pass

'''

local_dic={}

exec(code,{},local_dic)

一切皆为对象:

chinese=type(...)

class chinese:

  country='china'

  def __init__(self,name,age,sex):

    self.name=name

    self.age=age

    self.sex=sex

   def speak(self):

    print('%s speak chinese'%self.name)

print(chinese)

p=chinese('egon',18,'male')

print(type(p))

元类:类的类就是元类,

我们用class 定义的类使用来产生我们自己的对象的

1、内置元类type是用来专门产生class定义的类的

2、用内置的元类type,来实例化得到我们的类

class_name='chinese'

class_bases=(object,)

class_body='''

country='China'

def __init__(self,name,age,sex)

  self.name=name

  self.age=age

  self.sex=sex

def speak(self):

  print('%s speak Chinese'%self.name)

'''

class_dic={}

exec(class_body,{},class_dic)

类的三大要素,类名,空对象,类体

print(class_name,class_bases,class_dic)

Chinese=type(class_name,class_bases,class_dic)

3、储备知识__call__

class Foo:

  def __init__(self):

    pass

  def __str__(self):

    return'123'

  def __del__(self):

    pass

调用对象,则会自动触发对象下的绑定方法__call__的执行,

然后将对象本身当作第一个参数传给self,将调用对象括号内的值

传给*args**kwargs

  def __del__(self):

    pass

obj=Foo()

print(obj)

4、自定义元类:

class Mymeta(type):

  #来控制类Foo的创建

  def __init__(self,class_name,class_bases,class_dic):

    if not class_name.istitle():

      raise TypeError('类名的首字母必须大写')

    if not class_dic.get('__doc__'):

      raise TypeError('类中必须写好文档注释')

    super(Mymeta,self).__init__(class_name,class_bases,class_dic)

  #控制类Foo的调用过程,即控制实例化Foo的过程

  def__call__(self,*args,**kwargs):#self=Foo,args=(111,)kwargs={}

   1、造一个空对象

    obj=object.__new__(self)

   2、调用Foo.__init__,将连同调用Foo括号内的参数一同传给__init__

    self.__init__(obj,*args,**kwargs)

    return obj

   #Foo=Mymeta('Foo',(object),class_dic)

    class Foo(object,metaclass=Mymeta):

    '''

    文档注释

    ‘’‘

    x=1

    def __init__(self,y):

       self.Y=y

    def f1(self):

      print('from f1')

obj=Foo(111)


 

#单例模式

import settings

class MySQL:

  _instance=None

  def __init__(self,ip,port):

    self.ip=ip

    self.port=port

  @classmethod

   def singleto(cls):

    if not cls._instance:

      obj=cls(settings.IP,settings.PORT)

      cls._instance=obj

    return cls._instance

obj4=MySQL.singleton()

obj5=MySQL.singleton()

 

posted on 2018-04-17 14:16  lg04551  阅读(105)  评论(0编辑  收藏  举报