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)
老师和他的生日
原文地址:https://www.cnblogs.com/daju/p/10140352.html