码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象

时间:2019-02-25 15:18:48      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:strong   map   语法   font   返回   参考   使用   部分   att   

一、参考连接:

https://www.cnblogs.com/Eva-J/articles/7293890.html

二、初识类:

 1 class Person:         #类名
 2     country=China   #静态属性
 3     def __init__(self,*args):
 4         #self类似一个空字典
 5         #print(self.__dict__)
 6         self.name=args[0]
 7         self.hp=args[1]
 8         self.aggr=args[2]
 9         self.sex=args[3]
10     def walk(self,n):     #这里的self是一个参数,可以进行改变,但是这里必须要传递参数,这里的参数就是下面实例化的对象
11         print("%s走了%s步"%(self.name,n))
12 
13 print(Person.country)   #类名 可以查看类中的属性,不需要实例化就可以查看
14 
15 xiaoling=Person("邓晓灵",200,20,"f")  #实例化
16 
17 print(xiaoling.__dict__)   #查看所有属性值
18 print(xiaoling.country)    #查看属性值
19 
20 Person.walk(xiaoling,5)  #调用方法   类命.方法名(对象名)
21 xiaoling.walk(5)     #对象名.方法名(参数)
22 
23 print(Person.__dict__)    #这个的结果为字典
24 print(Person.__dict__[country])    #China
25 
26 Person.__dict__[country]=japan
27 print(Person.__dict__[country])     #‘mappingproxy‘ object does not support item assignment   对于类的字典,只能查看,无法修改。
28 
29 print(xiaoling.__dict__["name"])  #邓晓灵
30 xiaoling.name=二狗              #修改
31 print(xiaoling.__dict__[name])    #二狗

 参考图片:

技术图片

 

对象 = 类名()

过程:
类名() 首先 会创造出一个对象,创建了一个self变量
调用init方法,类名括号里的参数会被这里接收
执行init方法
返回self

对象能做的事:
查看属性
调用方法
__dict__ 对于对象的增删改查操作都可以通过字典的语法进行

类名能做的事:

实例化
调用方法 : 只不过要自己传递self参数
调用类中的属性,也就是调用静态属性
__dict__ 对于类中的名字只能看 不能操作

练习一:
 1 #小明,10岁,男,上山去砍柴
 2 #小明,10岁,男,开车去东北
 3 #小明,10岁,男,最爱大保健
 4 #老李,90岁,男,上山去砍柴
 5 #老李,90岁,男,开车去东北
 6 #老李,90岁,男,最爱大保健
 7 
 8 class Person:
 9     def __init__(self,name,age,sex):
10         self.name=name                  #这里不能打逗号,否则结果就会变成: (‘邓晓灵‘,),(26,)岁,男,上山去砍柴
11         self.age=age
12         self.sex=sex
13 
14     def shangshan(self):
15         print("%s,%s岁,%s,上山去砍柴"%(self.name,self.age,self.sex))
16     def drive(self):
17         print("%s,%s岁,%s,开车去东北"%(self.name,self.age,self.sex))
18     def favor(self):
19         print("%s,%s岁,%s,开车去东北"%(self.name,self.age,self.sex))
20 
21 xiaoling=Person(邓晓灵,26,)
22 caicai=Person(蔡莉,25,"")
23 
24 xiaoling.shangshan()
25 caicai.shangshan()

练习二:求圆形的周长和面积

 1 from math import pi
 2 class Circle:
 3     def __init__(self,r):
 4         self.r=r
 5     def zhouchang(self):
 6         print(2*pi*self.r)
 7     def mianji(self):
 8         print(self.r**2*pi)
 9 C1=Circle(5)
10 C1.zhouchang()
11 C1.mianji()

练习三:求正方形周长和面积

class Square:
    def __init__(self,L):
        self.Lenth=L
    def zhouchang(self):
        print(4*self.Lenth)
    def mianyi(self):
        print(self.Lenth**2)

S1=Square(4)  #4已经传进self了
S1.zhouchang()
S1.mianyi()

练习四:人狗大战

 1 #错误部分
 2 class Dog:
 3     def __init__(self,name,aggr,hp,kind):
 4         self.name=name
 5         self.aggr=aggr
 6         self.hp=hp
 7         self.kind=kind
 8     def bite(self,Person):     #这里的Person是一个形参,并不是下面的Person类。
 9         Person.hp-=Dog.aggr    #报错:type object ‘Dog‘ has no attribute ‘aggr‘
10         print("%s咬人,人掉了%s的血"%(Dog.name,Dog.aggr))
11 
12 class Dog:
13     def __init__(self,name,aggr,hp,kind):
14         self.name=name
15         self.aggr=aggr
16         self.hp=hp
17         self.kind=kind
18     def bite(self,Person):
19         Person.hp-=self.aggr
20         print(%s咬人,人掉了%s的血%(self.name,self.aggr))   #type object ‘Person‘ has no attribute ‘hp‘
21 
22 #正确部分
23 class Dog:
24     def __init__(self,name,aggr,hp,kind):
25         self.name=name
26         self.aggr=aggr
27         self.hp=hp
28         self.kind=kind
29     def bite(self,person):
30         person.hp-=self.aggr
31         print(%s咬人,人掉了%s的血%(self.name,self.aggr))
32 
33 
34 class Person:
35     def __init__(self,name,aggr,hp,sex):
36         self.name=name
37         self.aggr=aggr
38         self.hp=hp
39         self.sex=sex
40     def hit(self,dog):
41         dog.hp-=self.aggr
42         print("%s打了狗,狗掉了%s的血"%(self.name,self.aggr))
43 
44 D1=Dog("pipi",10,100,"二哈")
45 P1=Person("晓灵",20,200,"f")
46 
47 D1.bite(P1)
48 P1.hit(D1)

练习五:面向对象的交互之人狗大战

 1 class Dog:
 2     def __init__(self,name,hp,aggr,kind):
 3         self.name=name
 4         self.hp=hp
 5         self.aggr=aggr
 6         self.kind=kind
 7     def bite(self,person):
 8         person.hp-=self.aggr
 9 class Person:
10     def __init__(self,name,hp,aggr,sex):
11         self.name=name
12         self.hp=hp
13         self.aggr=aggr
14         self.sex=sex
15     def hite(self,dog):
16         dog.hp-=self.aggr
17 
18 D1=Dog("pipi",1000,200,"miaomiao")
19 P1=Person("晓灵",5000,300,"f")
20 
21 D1.bite(P1)
22 print(P1.hp)
23 
24 P1.hite(D1)
25 print(D1.hp)
以上为day22课程,已完成
 1 class Course:
 2     language = Chinese
 3     def __init__(self,teacher,course_name,period,price):
 4         self.teacher = teacher
 5         self.name = course_name
 6         self.period = period
 7         self.price = price
 8     def func(self):
 9         pass
10 
11 Course.language="English"   #类中的静态属性只能使用这个方法修改,不能使用dict来进行修改
12 Course.__dict__[language]="English"   #报错:‘mappingproxy‘ object does not support item assignment
13 print(Course.language)
14 
15 python = Course(egon,python,6 months,20000)
16 linux = Course(oldboy,linux,6 months,20000)
17 
18 python.language=印度   #这是在python对象的空间中创建了一个language属性,类是无法调用到的。参考截图
19 print(python.language)   #印度
20 print(linux.language)    #[‘Chinese‘],在自己的对空间中如果没找到language属性,就会去类空间中寻找

 参考下图:

技术图片

 1 #把‘Chinese‘,修改为[‘Chinese‘]
 2 class Course:
 3     language = [Chinese]
 4     def __init__(self,teacher,course_name,period,price):
 5         self.teacher = teacher
 6         self.name = course_name
 7         self.period = period
 8         self.price = price
 9     def func(self):
10         pass
11 
12 #Course.language[0]="English" 
13 python = Course(egon,python,6 months,20000)
14 linux = Course(oldboy,linux,6 months,20000)
15 
16 Course.language[0]="印度"
17 print(Course.language)  #[‘印度‘]
18 
19 python.language[0]=English
20 python.language=English   #区别上面和这个,这个相当于直接创建了新的属性,如下。上面一种是修改已存在的属性值。
21 print(python.__dict__)   #{‘language‘: ‘English‘, ‘name‘: ‘python‘, ‘period‘: ‘6 months‘, ‘price‘: 20000, ‘teacher‘: ‘egon‘}
22 print(Course.language)   #[‘English‘]

 参考截图:

技术图片

 

类中的静态变量 可以被对象和类调用
对象找名字 : 先找自己的 找类的 再找不到就报错
对象修改静态属性的值
对于不可变数据类型来说,类变量最好用类名操作
对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的


认识绑定:

组合:一个对象的属性值是另外一个类的对象
 1 class Dog:
 2     def __init__(self,name,aggr,hp,kind):
 3         self.name=name
 4         self.aggr=aggr
 5         self.hp=hp
 6         self.kind=kind
 7     def bite(self,person):
 8         person.hp-=self.aggr
 9 
10 class Person:
11     def __init__(self,name,aggr,hp,sex):
12         self.name=name
13         self.aggr=aggr
14         self.hp=hp
15         self.sex=sex
16         self.money=0
17     def attack(self,dog):
18         dog.hp-=self.aggr
19 
20     def get_weapon(self,weapon):
21         if self.money>weapon.price:
22             self.money-=weapon.price
23             self.aggr+=weapon.aggr
24             self.weapon=weapon
25         else:
26             print("余额不足")
27 class Weapon:
28     def __init__(self,name,aggr,njd,price):
29         self.name=name
30         self.aggr=aggr
31         self.njd=njd
32         self.price=price
33     def hand18(self,obj):
34         if self.njd>0:
35             obj.hp-=self.aggr*2
36             self.njd-=1
37 
38 D=Dog(pipi,100,500,teddy)
39 P=Person(晓灵,0.5,100,不详)
40 W=Weapon(打狗棒,150,3,998)
41 
42 P.money+=1000
43 P.get_weapon(W)
44 print(P.money)
45 print(P.aggr)
46 P.weapon.hand18(D)
47 print(D.hp)
48 print(P.weapon)
49 P.attack(D)
50 print(D.hp)

练习:圆环类

 1 from math import pi
 2 class Out_ring:
 3     def __init__(self,r):
 4         self.r=r
 5     def O_aera(self):
 6         #self.r ** 2 * pi
 7         return self.r ** 2 * pi
 8     def O_perimeter(self):
 9         return 2*pi*self.r
10 
11 class In_ring:
12     def __init__(self,r):
13         self.r=r
14     def I_area(self):
15         return pi*self.r**2
16     def I_perimeter(self):
17         return 2*pi*self.r
18 
19 class Cicle:
20     def __init__(self,O_r,I_r):
21         # self.O_r=O_r    #如果这样写就没有把值传到Out_ring中
22         # self.I_r=I_r
23         self.O_r=Out_ring(O_r)
24         self.I_r=In_ring(I_r)
25 
26     def area(self):
27         # Out_ring.O_aera(self.O_r)-In_ring.I_area(self.I_r)   #print出来结果为null,这里括号里不用在加值进去。
28         return self.O_r.O_aera()-self.I_r.I_area()
29     def perimeter(self):
30         return Out_ring.O_perimeter(self.O_r)+In_ring.I_area(self.I_r)
31 
32 C1=Cicle(5,4)
33 print(C1.area())
34 print(C1.perimeter())
35 
36 #修改
37 from math import pi
38 class Circle:
39     def __init__(self,r):
40         self.r=r
41 
42     def area(self):
43         return  self.r**2*pi
44     def perimeter(self):
45         return 2*self.r*pi
46 
47 class  Ring:
48     def __init__(self,Or,Ir):
49         self.OC=Circle(Or)   #这步是组合的过程
50         self.IC=Circle(Ir)
51 
52     def ring_area(self):
53         return self.OC.area()-self.IC.area()
54     def ring_perimeter(self):
55         return self.OC.perimeter()+self.IC.perimeter()
56 
57 
58 R=Ring(5,4)
59 print(R.ring_area())
60 print(R.ring_perimeter())

 






 

面向对象

标签:strong   map   语法   font   返回   参考   使用   部分   att   

原文地址:https://www.cnblogs.com/caili/p/10430399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!