面向对象(续)

一:不同的类的对象如何实现交互呢?

      因此必须掌握类中方法的传参和调用,例如要实现人狗大战中的交互,可以这么做,程序如下:

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,d):
        d.hp -= self.ad
        print('%s攻击了%s,%s掉了%s点血'%(self.name,d.name,d.name,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,p):
        p.hp -= self.ad
        print('%s咬了%s一口,%s掉了%s点血' % (self.name, p.name, p.name, self.ad))

alex = Person("张三","",20,15)
teddy = Dog('dsa','teddy',50,10)
teddy.bite(alex)
alex.attack(teddy)
View Code

二:面向对象过程中的命名空间和作用域

     1, 假设在实例化的过程中,创建了一个对象,我们把它用一个变量 a 接收,再为这个对象添加了name , hobby 等属性后,可以通过 a.name来查看对象的属性,在过程中,a 指向这个对象的内存空间,然后在内存空间里找到name

     2, 假设我们为这个对象添加了一个方法 attack ,那么可以通过 a.attack() 进行调用,在这个过程中,a 先找到自己的内存空间,然后通过里面的类对象指针找到这个类,再通过类找到这个方法attack,同理,也可以用  a.静态变量名 找到定义的静态变量。

ps : 对象的内存空间里: 只存储对象的属性,而不存储方法和静态属性, 方法和静态属性都存储在类的内存空间中,这样做是为了节省内存,让多个对象去共享类中的资源。

上述过程的示意图如下:

三:对静态变量进行修改,应该使用类名直接修改,

比如下面这个程序:

class Person:
    money = 0
    def __init__(self,name):
        self.name = name
    def work(self):
        print(self.name,'工作,赚了1000块钱')
        self.money += 1000   #此处若要对静态变量进行修改,
                            # 可以改成 Person.money+=1000,这样输出就为2000
father = Person('father')
mother = Person('mother')
mother.work()
father.work()
print(Person.money)   #此处输出为0
View Code
class Person:
    money = [1]
    def __init__(self,name):
        self.name = name
    def work(self):
        print(self.name,'工作,赚了1000块钱')
        self.money[0] += 1000

father = Person('father')
mother = Person('mother')
mother.work()
father.work()
print(Person.money)   # 2000 or 0?
View Code
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')
mother.work()
father.work()
print(Person.money)
View Code

ps:

1,对象属性是独有的,静态属性和方法是共享的

2,对象使用名字:先找自己内存空间中的,再找类的内存空间中的

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

 

【例】写一个类,完成一个功能 :可以统计这个类有几个对象。

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

【例】写一个类,计算多个圆的周长和面积。

from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    def cal_area(self):
        '''
        计算圆面积的方法
        :return:返回值是float数据类型的面积
        '''
        return pi*self.r**2
    def cal_perimeter(self):
        '''
        计算圆周长的方法
        :return:返回值是float数据类型的周长
        '''
        return pi * self.r * 2
for i in range(1,10,2):
    c1 = Circle(i)
    print(c1.cal_area())
    print(c1.cal_perimeter())
View Code

【例】用面向对象的思想实现打印:

小明,10岁,男,上山去砍柴 

小明,10岁,男,开车去东北

小明,10岁,男,最爱大保健

老李,90岁,男,上山去砍柴

老李,90岁,男,开车去东北

class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def hobby(self):
        print("%s,%d岁,%s,上山去砍柴" %(self.name,self.age,self.sex))
        print("%s,%d岁,%s,开车去东北" % (self.name, self.age, self.sex))
        print("%s,%d岁,%s,最爱大保健" % (self.name, self.age, self.sex))
alex=Person("小明",10,"")
wusir=Person("老李",90,"")
alex.hobby()
wusir.hobby()
View Code

 四:组合

1:什么是组合?

    组合就是把一个对象当另一个对象的属性,表示什么有什么的关系。

2:为什么要使用组合?

    因为独立的对象不能发挥作用,必须依赖另一个对象。

【注】组合实例分析

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 pi * self.r * 2


class ring:
    def __init__(self,R,r):
        self.x=Circle(R)
        self.y=Circle(r)
    def area(self):
        return self.x.area()-self.y.area()
    def perimeter(self):
        return self.x.perimeter()+self.y.perimeter()

r1 = ring(10, 5)
print(r1.area())
print(r1.perimeter())
View Code
class Clas:
    def __init__(self,name,num,course,type):
        self.name = name
        self.num = num
        self.course = course
        self.type = type

class Teacher:
    def __init__(self,name,sex,age,py11):
        self.name = name
        self.sex = sex
        self.age = age
        self.cls = py11        #对象py11当做对象boss_jin的属性

py11 = Clas('超级无敌s11',89,'python','脱产全栈')     #在clas里创建对象
boss_jin = Teacher('太白','',40,py11)
print(py11.course)          # 11期的课程
print(boss_jin.cls.course)  # 金老板所带的班级的课程
View Code
class Birthday:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

    def fmt(self):
        return '%s-%s-%s'%(self.year,self.month,self.day)
class Teacher:
    def __init__(self,name,birth):
        self.name = name
        self.birthday = birth

birth = Birthday(2018,8,18)
alex = Teacher('alex',birth)
print(alex.birthday.year)   # 调用组合对象中的属性
print(birth.fmt())
print(alex.birthday.fmt())  #调用组合对象中的方法
老师有生日

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2018-04-11 19:10  扬帆起航111  阅读(168)  评论(0编辑  收藏  举报