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)
     


  • 相关阅读:
    官方下载python源码,编译linux版本的python
    bootstrap冻结窗口
    LeetCode之TwoSum
    MyISAM和InnoDB索引实现对比(总结)
    InnoDB的三个关键特性(总结)
    InnoDB与MyISAM总结和对比(总结)
    C++类库开发之导出类设计原则
    C++类库开发详解
    C#各种配置文件使用,操作方法总结
    C/C++代码优化的27条建议
  • 原文地址:https://www.cnblogs.com/lpgit/p/9397734.html
Copyright © 2011-2022 走看看