Python类

2018-07-25 13:12:30来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折


一、类的定义

  class 类名 ():#括号里是写父类,默认是object
    #属性
    #方法
  类名首字母一般大写

  #给一个对象添加属性的方法:
    对象名.新的属性名 = 值

  #获得目标对象的属性:
    1.对象.属性
    2.定义一个方法,这个方法中,使用 self.属性

 

二、类的内建属性

  __init__ #初始化函数,在__new__之后
  __new__ #创建实例时,生成实例属性
  __class__ #实例所在的类
  __str__ #print(类实例)时触发
  __del__ #删除实例


  #__init__方法,当创建完一个对象后,立马会自动调用:
    def __init__(self):
      print('hahaha')


  #demo:
  class Cat():
    #定义方法
    #__init__定义默认属性,
    #__init__方法不需要调用,创建完对象后,立马自动调用
    def __init__(self,newColor,newWeight):
      self.color = newColor
      self.weight = newWeight
      #newColor,newWeight,是局部变量,不是对象的属性
      #如果要在__init__方法中添加属性,就要用 self.属性名 的方法

    def eat(self):
      print('------吃------')
    def drink(self):
      print('------喝------')
    def sleep(self):
      print('------睡------')

    def printInfo(self):
      print(self.color)
      print(self.weight)

  dahuang = Cat('花色',5)
  dahuang.eat()
  dahuang.drink()
  dahuang.sleep()
  #定义了默认属性,可以直接调用
  dahaung.printInfo()

  #给对象赋予属性
  dahuang.color = '黑色'
  dahuang.weight = 8


三、类的继承:

  #demo
  class Cat(object):
    def run(self):
      print('---------跑-------')

  class Bosi(Cat):
    pass

  bosi = Bosi()

  bosi.run()

 

四、类方法与静态方法:

 

  #demo1
  class Cat(object):

    #类属性
    num = 0

    #实例方法
    def __init__(self):
      #实例属性
      self.age = 1
    #如果类属性的名字和实例属性的名字相同
    #那么通过对象访问的时候,会优先获取实例属性
    #self.num = 100

    def run(self):
      print('--------跑------')

    #类方法
    @classmethod
    def setNum(cls,newNum):
      cls.num = newNum

    #静态方法
    @staticmethod
    def printTest():
      print('验证Test类')

  mao = Cat()
  #用对象取访问类属性是可以的
  print(mao.num)

  #常用的方式是用类去访问类属性
  print(Cat.num)

  #通过类方法修改类属性
  #mao.setNum(200)也可以
  Cat.setNum(300)
  print(Cat.num)

  #调用静态方法
  Cat.printTest()

  #无法通过类名访问实例属性或实例方法
  #如:print(Cat.age)会报错

 

 

  #demo2:

  #设置与调用私有属性时的property作用:
  class Test():
    def __init__(self):
      self.__num = 100


    #第一种方式
    def getNum(self):
      return self.__num

    def setNum(self,num):
      self.__num = num

    num = property(getNum,setNum)#括号里的get,set顺序不能变


    '''
    另一种方式:
    @property
    def num(self):
      return self.__num

    @num.setter
    def num(self,num):
      self.__num = num
    '''


  t = Test()
  t.num = 200#相当于调用t.setNum(200)
  print(t.num)#相当于调用t.getNum()

 

  #demo3:

  #动态添加类方法:

  import types

  class Test(object):
    def __init__(self,name):
      self.name = name

  #添加实例方法:
  def run(self):
    print('running')

  t1 = Test('小明')
  t1.run = types.MethodType(run,t1)#(功能名,对象名)
                    #表示把对象与该方法连接起来
  t1.run()

  #添加静态方法:
  @staticmethod
  def sleep():
    print('sleeping')

  Test.sleep = sleep
  Test.sleep()


  #添加类方法:
  @classmethod
  def eat(cls):
    print('eating')

  Test.eat = eat
  Test.eat()

 

  #完成创建一个对象
    #当对象执行的时候,先调用__new__方法完成创建对象,
    #然后调用__init__方法,完成初始化
    def __new__(cls):
      pass
      return super().__new__(cls)

  #限制类属性的方法:
    __slots__ = ('name''age')#只能添加限定的属性,添加其他属性会报错


五、单例实现:

  #demo
  class Single(object):
    #控制返回同一个对象
    __instance = None
    #控制只初始化一次,__init__定义时用if语句判断,使其只执行一次
    #通过__flag= False实现

    def __new__(cls):
      if not cls.__instance:
        cls.__instance = object.__new__(cls)
      return cls.__instance

  a = Single()
  b = Single()
  print(a)
  print(b)

六、元类:

  #类实质上也是一个对象,由元类创建
  type('类名',(父类),{属性,方法})
  #demo
  def printNum(self):
    print('num = %d'% self.num)

  Test = type('Test',(),{'printNum':printNum})

  #上面的定义方式等价于
  class Test():
    def printNum(self):
      print('num = %d'% self.num)

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Odoo 中使用 celery 实现高性能异步任务队列

下一篇:返回(统计)一个列表中出现次数最多的元素