python面向对象
__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
# 组合 # 人狗大战 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.aggr class 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 -= 1 alex = Person('alex',0.5,100,'不详') jin = Dog('金老板',100,500,'teddy') w = Weapon('打狗棒',100,3,998) # alex装备打狗棒 alex.money += 1000 alex.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类的对象
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())
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 = day 10 11 class Course: 12 def __init__(self,course_name,period,price): 13 self.name = course_name 14 self.period = period 15 self.price = price 16 17 class Teacher: 18 def __init__(self,name,age,sex,birthday): 19 self.name = name 20 self.age = age 21 self.sex = sex 22 self.birthday =birthday 23 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)