zoukankan      html  css  js  c++  java
  • python笔记(18)--类的命名空间、实例化绑定方法和类的组合用法

    内容目录:

    • 类的命名空间
    • 实例化的绑定方法
    • 类的组合用法

    面向对象回顾:

    示例一:人狗大战:

    class Dog:
        def __init__(self,name,blood,aggr,kind):
            self.name = name
            self.blood = blood
            self.aggr = aggr
            self.kind = kind
        def bite(self,person):
            #狗咬人,人掉血
            person.hp -= self.aggr
            print('狗咬人,人剩了%s血'%(person.hp))
    
    class Person:
        def __init__(self,name,blood,aggr,sex):
            #self就是一个可以存储很多属性的大字典
            self.name = name
            self.hp = blood
            self.aggr = aggr
            self.sex = sex
        def attack(self,dog):
            dog.blood -= self.aggr
            print('人打狗,狗剩了%s血'%(dog.blood))
    
    jin = Dog('金老板',100,20,'teddy')
    alex = Person('alex',1000,10,'男')
    Dog.bite(jin,alex)
    Person.attack(alex,jin)
    

    示例二:计算圆的周长和面积:

    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        def area(self):
            return pi*(self.r**2)
        def perimeter(self):
            return 2*pi*self.r
    
    obj = Circle(5)
    area = obj.area()
    perimeter = obj.perimeter()
    print(area,perimeter)
    
    • 定义类

      class 类名:     #-----定义类
          变量 :     #-----类属性,静态属性
          def 函数:   #-----方法,动态属性
      
    • init方法

      • python帮我们创建了一个对象self
      • 每当我们调用类的时候都会自动触发这个方法,默认传self
      • 在init方法里可以对self进行赋值
    • self是什么 self拥有属性都属于对象

      • 在类的内部,self就是一个对象
    • 实例化

      • 对象 = 类(参数是init方法的)
    • 实例 = 对象

      • 两者之间没有区别
    • 对象查看属性

      • 对象.属性名
    • 对象调用方法

      • 对象.方法名(参数)

    内容详细:

    1.类的命名空间

    • 类中的静态变量,可以被实例后的对象和类本身调用

    • 类中的变量无法被实例化后的对象修改

    • 对于不可变数据类型来说,类变量最好用类名操作

    • 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

      class Course:
          language = 'Chinese'
          pice = ['北京','上海']
          def __init__(self,teacher,course_name,period,price):
              self.teacher = teacher
              self.name = course_name
              self.period = period
              self.price = price
          def func(self):
              pass
      
      Course.language = 'English'
      # Course.__dict__['language'] = 'CHINA'      #不能修改内部默认的字典,修改无效
      print(Course.language)              # English
      python = Course('alec','python','6 months',2000)
      linux = Course('oldboy','linux','4 months',1000)
      
      #对于类中静态不可变类型来说,实例化对象不可修改类中静态变量,只能重新在自己开辟的空间中创建赋值
      python.language = 'python'      #重新开辟内存空间,重新赋值language = 'python'
      print(Course.language,python.language)     #English python
      linux.language = 'linux'        #重新开辟内存空间,重新赋值language = 'linux'
      print(Course.language,linux.language)       #English linux
      
      #对于类中静态可变类型来说,实例化对象修改了相当于对类中变量修改
      python.pice[0] = '郑州'
      print(Course.pice,python.pice)             #['郑州', '上海'] ['郑州', '上海']
      linux.pice[1] = '广州'
      print(Course.pice,linux.pice)              #['郑州', '广州'] ['郑州', '广州']
      

    练习:

    • 创建一个类,每实例化一个对象就计数一次。最终所有的对象共享这个数据

      class Foo:
          count = 0
          def __init__(self):
              Foo.count += 1
      
      
      f1 = Foo()
      f2 = Foo()
      print(f1.count)     #2
      print(f2.count)     #2
      
      f3 = Foo()
      print(f1.count)     #3
      

    2.实例化的绑定方法

    • 实例化调用方式时,内存空间为重新开辟后的地址

      class Foo:
          def func(self):
              print('func')
          def inner(self):
              pass
      f1 = Foo()
      print(Foo.func) #<function Foo.func at 0x000002C48D8FBA60>
      print(f1.func)  #<bound method Foo.func of <__main__.Foo object at 0x000002C48D8F9470>>
      print(f1.inner) #<bound method Foo.inner of <__main__.Foo object at 0x000002C48D8F9470>>
      #实例化调用方法bound到类中的方法
      

    3.类的组合用法

    • 组合:最起码为两个类以上才能用到组合

      class Dog:
          def __init__(self,name,aggr,hp,kind):
              self.name = name
              self.aggr = aggr
              self.hp = hp
              self.kind = kind
          def bite(self,person):
              person.hp -= self.aggr
      
      class Person:
          def __init__(self,name,aggr,hp,sex):
              self.name = name
              self.aggr = aggr
              self.hp = hp
              self.sex = sex
              self.money = 0
          def attack(self,dog):
              dog.hp -= self.aggr
          def get_weapon(self,weapon):
              if self.money >= weapon.price:
                  self.money -= weapon.price
                  self.weapon = weapon
                  self.aggr += weapon.aggr
              else:
                  print('余额不足')
                  
      class Weapon:
          def __init__(self,name,aggr,njd,price):
              self.name = name
              self.aggr = aggr
              self.njd = njd
              self.price = price
          def hand18(self,person):
              if self.njd >=0:
                  person.hp -= self.aggr * 2
                  self.njd -= 1
      
      alex = Person('alex',10,100,'男')
      jin = Dog('金老板',100,500,'teddy')
      w = Weapon('打狗棒',100,3,998)
      
      alex.money += 1000
      alex.get_weapon(w)
      print(alex.aggr)
      
      alex.attack(jin)
      print(jin.hp)
      alex.weapon.hand18(jin)				#两个类组合
      print(jin.hp)
      
  • 相关阅读:
    浅析人脸检测之Haar分类器方法
    python调用网络摄像机
    jvm常用优化方案和方法
    jvm优化-垃圾收集器的类型
    jvm调优-垃圾回收算法
    JVM调优-java虚拟机内存模型及参数设置
    java NIO-Buffer
    java NIO-Channel
    java权限设置文件-java.policy
    java安全-安全管理器
  • 原文地址:https://www.cnblogs.com/lynlearnde/p/12912258.html
Copyright © 2011-2022 走看看