先看看一般的类定义如下:
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