zoukankan      html  css  js  c++  java
  • 4-11 对象的交互 命名空间作用域

    1,对象的交互

    人和狗大战之交互

    class Person:
        role = 'person'
        def __init__(self,name,sex,hp,ad):
            self.name= name
            self.sex = sex
            self.hp = hp
            self.ad = ad
        def attack(self,dog):
            print('%s攻击了%s,%s掉了%s滴血'%(self.name,dog.name,dog.name,self.ad))
            dog.hp -= self.ad
    
    class Dog:
        def __init__(self,name,kind,hp,ad):
            self.name = name
            self.kind = kind
            self.hp = hp
            self.ad = ad
        def bite(self,person):
            print('%s咬了%s,%s掉了%s点血'%(self.name,person.name,person.name,self.ad))
            person.hp -= self.ad
    alex = Person('sb','male',45,35)
    boss_jin = Person('金老板','male',34,45)
    teddy = Dog('小虎','teddy',45,50)
    alex.attack(teddy)
    print(teddy.hp)
    teddy.bite(boss_jin)
    print(boss_jin.hp)
    View Code

    2,命名空间作用域

    对象的内存空间中,只存储对象的属性,而不存储方法和静态属性。对象能找类。

    方法和静态属性都存储在类的内存空间中,为了节省内存,让多个对象去共享类中的资源。

    class Person:
        role = 'person'
        def __init__(self,name,sex,hp,ad):
            self.name = name
            self.sex = sex
            self.hp = hp
            self.ad = ad
            self.hobby = 'girl'#在自己的对象空间加载
        def attack(self):
            print('%s发起一次攻击'%self.name)
    
    alex = Person('sb', 'male',44,44)
    boss_jin = Person('金老板','amle',60,63)
    alex.attack()
    alex.role = 'dog'#在自己的对象空间加载alex.role = 'dog'
    print(alex.__dict__)
    print(boss_jin.role)#person
    print(Person.role)#可以看见静态变量并没有改变  perso

    加载顺序:1,类的内存空间,静态变量,方法。2,对象的内存空间,类对象指针,通过类对象指针找到类。

    1,静态属性和方法是共存的。对象的属性是对立的。2,对象使用名字,先找自己的内存空间,再找类的内存空间。

    对于静态属性的修改,应该使用类名直接修改。调用静态变量:类名.静态变量。

    class Person:
        money = 0
        def __init__(self,name):
            self.name = name
        def work(self):
            print(self.name,'工作赚了1000元钱')
            self.money += 1000
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money)#静态变量并没有改变
    # father 工作赚了1000元钱
    # mother 工作赚了1000元钱
    # 0
    class Person:
        money = [0]
        def __init__(self,name):
            self.name = name
        def work(self):
            print(self.name,'工作赚了1000元钱')
            self.money[0] += 1000
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money)#2000

    class Person:
        money = [0]
        def __init__(self,name):
            self.name = name
        def work(self):
            print(self.name,'工作赚了1000元钱')
            self.money = [Person.money[0] + 1000]
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money)#0

    写一个类统计有几个对象

    class Foo:
        count = 0
        def __init__(self):
            Foo.count += 1
    f1 = Foo()
    f2 = Foo()
    f3 = Foo()
    f4 = Foo()
    f5 = Foo()
    print(Foo.coun

    程序的解耦:

    1,当计算的规模足够大的时候,我们应该在编码的过程中,让操作尽量原子化。

    2,尽量用返回值代替print.

     求 几个圆的面积(1,3,5,7,9)

    from math import pi
    class Area:
        def __init__(self,r):
            self.r = r
        def circle(self):
            return pi*self.r*2
        def perimeter(self):
            return pi*self.r**2
    for i in range(1,10,2):
        ci = Area(i)
        print(ci.circle())
        print(ci.perimeter())

     练一练

    小明,10岁,男,上山去砍柴
    小明,10岁,男,开车去东北
    小明,10岁,男,最爱大保健
    老李,90岁,男,上山去砍柴
    老李,90岁,男,开车去东北
    老李,90岁,男,最爱大保健
    老张…
    class Person:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
        def hobby(self):
            print('%s,%s岁,%s,上山去砍材'%(self.name,self.age,self.sex))
            print('%s,%s岁,%s,开车去东北'%(self.name,self.age,self.sex))
            print('%s,%s岁,%s,最爱大保健'%(self.name,self.age,self.sex))
    xiao = Person('小明','10','')
    li = Person('老李',90,'')
    xiao.hobby()
    li.hobby()
    View Code

    计算两个圆环的面积和周长

    from math import pi
    class Area:
        def __init__(self,out_radius,in_radius):
            self.out_radius = out_radius
            self.in_radius = in_radius
    
        def perimeter(self):
            return pi*self.out_radius*2 + pi*self.in_radius*2
    
        def acir(self):
            return pi*self.out_radius**2 - pi*self.in_radius**2
    ci = Area(21,20)
    print(ci.perimeter())
    print(ci.acir()
  • 相关阅读:
    计算机通信
    笔记0402
    笔记0414
    vb6 VS vb.net int数据类型
    jQuery好网站
    jQuery实现图片翻滚
    jQuery获取一组单选按钮的值
    Redhat安装、使用及服务器应用FAQ
    js判断变量是否赋值(存在)
    IDE 与SATA区别
  • 原文地址:https://www.cnblogs.com/yzxing/p/8796806.html
Copyright © 2011-2022 走看看