博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象(续)
阅读量:5969 次
发布时间:2019-06-19

本文共 4854 字,大约阅读时间需要 16 分钟。

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

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

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,这样输出就为2000father = 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] += 1000father = 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 += 1f1 = Foo()f2 = Foo()f3 = Foo()f4 = Foo()f5 = Foo()print(Foo.count)
View Code

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

from math import piclass 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 * 2for 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 piclass Circle:    def __init__(self,r):        self.r=r    def area(self):        return pi*self.r**2    def perimeter(self):        return pi * self.r * 2class 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 = typeclass 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 = birthbirth = Birthday(2018,8,18)alex = Teacher('alex',birth)print(alex.birthday.year)   # 调用组合对象中的属性print(birth.fmt())print(alex.birthday.fmt())  #调用组合对象中的方法
老师有生日

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/leiwei123/p/8796805.html

你可能感兴趣的文章
jQuery监听文本框值改变触发事件(propertychange)
查看>>
甲骨文Java Archive
查看>>
查看数据库错误日志的位置
查看>>
电信网络拓扑图自动布局
查看>>
C#中List〈string〉和string[]数组之间的相互转换
查看>>
洛谷P1108 低价购买[DP | LIS方案数]
查看>>
通达信里的统计函数及区块背景函数
查看>>
redis主从配置<转>
查看>>
8 行 Node.js 代码实现代理服务器
查看>>
水印,图片验证码
查看>>
C#编程(七十六)----------使用指针实现基于栈的高性能数组
查看>>
Android 类库
查看>>
vue和iview应用中的一些问题(持续更新)
查看>>
基于 Workman 实现Web扫描登录
查看>>
karma如何与测试框架合作2之webpack
查看>>
关于VSCode更新对于emmet2.0支持的配置更改问题。
查看>>
10分钟搭建MySQL Binlog分析+可视化方案
查看>>
vmware虚拟机配置串口
查看>>
小型自动化运维--expect脚本之传递函数
查看>>
Nsrp实现juniper防火墙的高可用性【HA】!
查看>>