zoukankan      html  css  js  c++  java
  • python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间
    类里 可以定义两种属性:
    1. 静态属性
    2. 动态属性
    class Course:
        language = 'Chinese'
        def __init__(self, teacher, course_name, period, price):
            self.teacher = teacher     # 授课老师
            self.name = course_name            # 课程名字
            self.period = period        # 课程周期
            self.price = price          # 课程价格
    
        def func(self):
            pass
    
    python = Course('egon', 'python', '6 months', 20000)
    
    print(Course.language)
    Course.language = 'English'         # 这种方式可以修改静态属性,但通过Course.__dict__['language'] = 'English' 修改不了
    print(Course.language)
    
    linux = Course('oldboy', 'linux', '6 months', 18000)
    print(python.language)
    
    python.language = 'INS'
    print(Course.language)
    print(python.language)
    print(linux.language)
    
    print(python.__dict__)
    print(linux.__dict__)
    1 # linux 比python少了一个language,说明python创建了一个language = 'INS',
    2 # 但Course里面的language并不会变
    3 # 但这样的话就永远用不到Course里面的language了
    4 # 把python里面的删除就可以了:
    5 del python.language
    6 print(python.language)
    对于 不可变数据类型 来说,类变量最好用类操作,而不适合用对象操作
    对于 可变数据类型 来说,对象名的修改是共享的,重新赋值是独立的
    
    类中的静态变量,可以被对象和类调用
    上面说的是对于不可变类型,那么对于可变数据类型呢?
    class Course:
        language = ['Chinese']
        def __init__(self, teacher, course_name, period, price):
            self.teacher = teacher     # 授课老师
            self.name = course_name            # 课程名字
            self.period = period        # 课程周期
            self.price = price          # 课程价格
    
        def func(self):
            pass
    
    python = Course('egon', 'python', '6 months', 20000)
    
    
    Course.language[0] = 'English'
    print(Course.language)
    
    linux = Course('oldboy', 'linux', '6 months', 18000)
    
    
    # python.language[0] = 'INS'
    # print(Course.language)
    # print(python.language)
    # print(linux.language)               # 三个都变成了'INS', 列表里面的值改变了,但不改变列表所在的内存地址
    
    # 但是,如果这样写
    python.language = ['Ins']
    print(Course.language)
    print(python.language)          # 依然只有python.language变了, 相当于 重新赋值
    print(linux.language)
    
    
    # 创建一个类,每实例化一个对象就记录下来
    # 最终所有的对象共享这个数据
    
    class Foo:
        count = 0
        def __init__(self):
            Foo.count += 1
    f1 = Foo()
    f2 = Foo()
    f3 = Foo()
    print(f1.count)
    print(f2.count)
    print(f3.count)
    print(Foo.count)            # 通过类名就可以知道实例化了多少个对象
    # 函数名不要和静态属性重名
    # 认识绑定方法
    
    def func():pass
    print(func)
    
    class Foo:
        def func(self):
            print('func')
    f1 = Foo()
    print(Foo.func)
    print(f1.func)
    print(f1)

    二. 组合

     1 # 面向对象的三大特性:继承 多态 封装 -- 之后学
     2 # 组合
     3 # 人狗大战
     4 
     5 class Dogs:
     6     def __init__(self,name ,HP, aggr, kind):
     7         self.name = name
     8         self.HP = HP
     9         self.aggr = aggr
    10         self.kind = kind
    11 
    12     def bite(self,person):
    13         person.HP -= self.aggr
    14 
    15 class Person:
    16     def __init__(self,name ,HP, aggr, sex):
    17         self.name = name
    18         self.HP = HP
    19         self.aggr = aggr
    20         self.sex = sex
    21         self.money = 0
    22 
    23     def attack(self,dog):
    24         dog.HP -= self.aggr
    25 
    26     def get_weapon(self,weapon):
    27         if self.money >= weapon.price:
    28             self.money -= weapon.price
    29             self.weapon = weapon
    30             self.aggr += weapon.aggr
    31         else:
    32             print('余额不足, 请充值')
    33 class Weapon:                   # 定义一个装备类
    34     def __init__(self, name, aggr, naijiu, price):
    35         self.name = name
    36         self.aggr = aggr
    37         self.naijiu = naijiu
    38         self.price = price
    39 
    40     def hand_18(self, peason):
    41         if self.naijiu > 0:
    42             peason.HP -= self.aggr * 2
    43             self.naijiu -= 1
    44 alex = Person('alex', 100, 1, '不详')
    45 jin = Person('金老板', 200, 2, '泰迪')
    46 weapon = Weapon('打狗棒', 5, 100, 9.9)
    47 
    48 # 装备
    49     # 增加伤害
    50     # 增加血量
    51 # 给alex装备打狗棒
    52 # 打不过金老板,于是 充钱买装备
    53 alex.money += 1000
    54 alex.get_weapon(weapon)
    55 print(alex.weapon)
    56 print(alex.aggr)
    57 alex.attack(jin)
    58 print(jin.HP)
    59 
    60 alex.weapon.hand_18(jin)
    61 print(jin.HP)
    62 
    63 
    64 # 组合:一个对象的属性值是另外一个类的对象
    65 #       alex.weapon 是 Weapon 类的一个对象

    三. 组合的一些小练习

     1 创建一个圆环类
     2 
     3 from math import pi
     4 class Circle:
     5     def __init__(self, r):
     6         self.r = r
     7     def area(self):
     8         return self.r ** 2 * pi
     9     def perimeter(self):
    10         return 2 * pi * self.r
    11 
    12 class Ring:
    13     def __init__(self,outside_r, inside_r):
    14         self.outside_c = Circle(outside_r)
    15         self.inside_c = Circle(inside_r)
    16     def area(self):
    17         return self.outside_c.area() - self.inside_c.area()
    18     def perimeter(self):
    19         return self.outside_c.perimeter() + self.inside_c.perimeter()
    20 
    21 ring = Ring(20, 10)
    22 print(ring.area())
    23 print(ring.perimeter())

     1 # 创建一个老师类
     2 # 老师有生日
     3 # 生日也是一个类:年、月、日 三个属性
     4 # 组合实现
     5 
     6 class Teacher:
     7     def __init__(self,name, age, sex, birthday):
     8         self.name = name
     9         self.age = age
    10         self.sex = sex
    11         self.bir = birthday
    12         self.course = Course('python','6 month',20000)
    13 
    14 class Course:
    15     def __init__(self, course_name, period, price):
    16         self.name = course_name            # 课程名字
    17         self.period = period        # 课程周期
    18         self.price = price          # 课程价格
    19 
    20 
    21 
    22 class Birthday:
    23     def __init__(self, year, month, day):
    24         self.year = year
    25         self.month = month
    26         self.day = day
    27 birthday = Birthday(2017, 3, 20)
    28 teacher = Teacher('KID', 21, '', birthday)
    29 print(teacher.name)
    30 print(teacher.bir.year)
    31 print(teacher.bir.month)
    32 print(teacher.course.price)
     


  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/lpgit/p/9397734.html
Copyright © 2011-2022 走看看