__init__方法 初始化方法
python帮我们创建了一个对象self 每当我们调用类的时候就会自动触发这个方法。默认传self 在init方法里面可以对self进行赋值self是什么 self拥有属性都属于对象在类的内部,self就是一个对象 alex = Person()alex.walk == Person.walk(alex) 实例化对象 = 类(参数是init方法的) 实例、对象 完全没有区别 对象查看属性 对象.属性名对象调用方法 对象.方法名(参数) ==类名.方法名(对象名,参数),
self有点像是一个字典,self.属性就是key,=号后面内容就是value
类和对象都有.__dict__方法,返回的就是个字典
对象.__dict__[属性]=sth,可以修改属性值
类属性不能像上边这种方法改
类属性是可以给对象共享的,
类中有属于类的属性(不加self),可以使用,类.属性 调用,也可以对象.属性调用,当此属性是不可变类型时,如果使用对象.属性=sth,进行修改,实际相当用在对象的内存空间中创建了self.属性=sth,类.属性不受影响。如果还想通过对象.属性调用类.属性的值,要用del函数把对象.属性删除,这样在对象找不到该属性的时候,就会去类的内存空间中去找。
但如果类属性是可变类型,例如list, 类.属性a=list ,调用对象.属性a[0]=sth,实际上将类.属性a也进行了修改,但是如果调用对象.属性a=sth,实际上又是在对象的内存空间中创建了一个self.属性a=sth
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
# 组合# 人狗大战class Dog: def __init__(self,name,aggr,hp,kind): self.name = name self.aggr = aggr self.hp = hp self.kind = kind def bite(self,person): person.hp -= self.aggrclass Person: def __init__(self,name,aggr,hp,sex): self.name = name self.aggr = aggr self.hp = hp self.sex = sex self.money = 0 def attack(self,dog): dog.hp -= self.aggr def get_weapon(self,weapon): if self.money >= weapon.price: self.money -= weapon.price self.weapon = weapon self.aggr += weapon.aggr else: print("余额不足,请先充值")class Weapon: def __init__(self,name,aggr,njd,price): self.name = name self.aggr = aggr self.njd = njd self.price = price def hand18(self,person): if self.njd > 0: person.hp -= self.aggr * 2 self.njd -= 1alex = Person('alex',0.5,100,'不详')jin = Dog('金老板',100,500,'teddy')w = Weapon('打狗棒',100,3,998)# alex装备打狗棒alex.money += 1000alex.get_weapon(w)print(alex.weapon)print(alex.aggr)alex.attack(jin)print(jin.hp)alex.weapon.hand18(jin)print(jin.hp)# 组合 :一个对象的属性值是另外一个类的对象# alex.weapon 是 Weapon类的对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 from math import pi 2 class Circle: 3 def __init__(self,r): 4 self.r = r 5 def area(self): 6 return self.r**2 * pi 7 def perimeter(self): 8 return 2*pi*self.r 9 10 class Ring:11 def __init__(self,outside_r,inside_r):12 self.outside_c = Circle(outside_r)13 self.inside_c = Circle(inside_r)14 def area(self):15 return self.outside_c.area() - self.inside_c.area()16 def perimeter(self):17 return self.outside_c.perimeter()+self.inside_c.perimeter()18 19 ring = Ring(20,10)20 print(ring.area())21 print(ring.perimeter())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 创建一个老师类 2 # 老师有生日 3 # 生日也可以是一个类 4 # 组合 5 class Birthday: 6 def __init__(self,year,month,day): 7 self.year = year 8 self.month = month 9 self.day = day10 11 class Course:12 def __init__(self,course_name,period,price):13 self.name = course_name14 self.period = period15 self.price = price16 17 class Teacher:18 def __init__(self,name,age,sex,birthday):19 self.name = name20 self.age = age21 self.sex = sex22 self.birthday =birthday23 self.course = Course('python','6 month',2000)24 25 b = Birthday(2018,1,16)26 egg = Teacher('egon',0,'女',b)27 print(egg.name)28 print(egg.birthday.year)29 print(egg.birthday.month)30 print(egg.course.price)