先看看一般的类定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class 类名: def __init__( self ,参数 1 ,参数 2 ): self .对象的属性 2 = 参数 2 def 方法名( self ): pass def 方法名 2 ( self ): pass 对象名 = 类名( 1 , 2 ) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性 1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可 |
对象之间的交互
现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。
现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法。
有了狗类,我们还要实例化一只实实在在的狗出来。
然后人和狗就可以打架了。现在我们就来让他们打一架吧!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class Person: # 定义一个人类 role = 'person' # 人的角色属性都是人 def __init__( self , name, aggressivity, life_value): self .name = name # 每一个角色都有自己的昵称; self .aggressivity = aggressivity # 每一个角色都有自己的攻击力; self .life_value = life_value # 每一个角色都有自己的生命值; def attack( self ,dog): # 人可以攻击狗,这里的狗也是一个对象。 # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降 dog.life_value - = self .aggressivity class Dog: # 定义一个狗类 role = 'dog' # 狗的角色属性都是狗 def __init__( self , name, breed, aggressivity, life_value): self .name = name # 每一只狗都有自己的昵称; self .breed = breed # 每一只狗都有自己的品种; self .aggressivity = aggressivity # 每一只狗都有自己的攻击力; self .life_value = life_value # 每一只狗都有自己的生命值; def bite( self ,people): # 狗可以咬人,这里的狗也是一个对象。 # 狗咬人,那么人的生命值就会根据狗的攻击力而下降 people.life_value - = self .aggressivity egg = Person( 'egon' , 10 , 1000 ) #创造了一个实实在在的人eggprint(egg.name) # 在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常 ha2 = Dog( '二愣子' , '哈士奇' , 10 , 1000 ) #创造了一只实实在在的狗ha2 print (ha2.life_value) #看看ha2的生命值 egg.attack(ha2) #egg打了ha2一下 print (ha2.life_value) #ha2掉了10点血 |
面向对象的组合用法
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Weapon: def prick( self , obj): # 这是该装备的主动技能,扎死对方 obj.life_value - = 500 # 假设攻击力是500 class Person: # 定义一个人类 role = 'person' # 人的角色属性都是人 def __init__( self , name): self .name = name # 每一个角色都有自己的昵称; self .weapon = Weapon() # 给角色绑定一个武器; egg = Person( 'egon' ) egg.weapon.prick() #egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法 |
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 ''' def __init__( self ,radius): self .radius = radius def area( self ): return pi * self .radius * self .radius def perimeter( self ): return 2 * pi * self .radius circle = Circle( 10 ) #实例化一个圆 area1 = circle.area() #计算圆面积 per1 = circle.perimeter() #计算圆周长 print (area1,per1) #打印圆面积和周长 class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 ''' def __init__( self ,radius_outside,radius_inside): self .outsid_circle = Circle(radius_outside) self .inside_circle = Circle(radius_inside) def area( self ): return self .outsid_circle.area() - self .inside_circle.area() def perimeter( self ): return self .outsid_circle.perimeter() + self .inside_circle.perimeter() ring = Ring( 10 , 5 ) #实例化一个环形 print (ring.perimeter()) #计算环形的周长 print (ring.area()) #计算环形的面积 |
用组合的方式建立了类与组合的类之间的关系,它是一种‘有'的关系,比如教授有生日,教授教python课程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class BirthDate: def __init__( self ,year,month,day): self .year = year self .month = month self .day = day class Couse: def __init__( self ,name,price,period): self .name = name self .price = price self .period = period class Teacher: def __init__( self ,name,gender,birth,course): self .name = name self .gender = gender self .birth = birth self .course = course def teach( self ): print ( 'teaching' ) p1 = Teacher( 'egon' , 'male' , BirthDate( '1995' , '1' , '27' ), Couse( 'python' , '28000' , '4 months' ) ) print (p1.birth.year,p1.birth.month,p1.birth.day) print (p1.course.name,p1.course.price,p1.course.period) ''' 运行结果: 1995 1 27 python 28000 4 months ''' |
以上就是详解python对象之间的交互的详细内容,更多关于python 对象交互的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/111testing/p/13694004.html