zoukankan      html  css  js  c++  java
  • 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)
    老师和他的生日
  • 相关阅读:
    WebSocket
    Spring Web MVC
    对象关系映射(ORM)数据访问
    使用JDBC进行数据访问
    【Mysql】【基础综合题解】大一下学期数据库综合训练题解
    【Mysql】【解决问题】[Err] 1055
    【JavaSE】【IO流】复制单级或多级文件夹
    C#使用FFmpeg的总结
    C#一个IM系统简单总结
    重新开启博客
  • 原文地址:https://www.cnblogs.com/daju/p/10140352.html
Copyright © 2011-2022 走看看