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)
 


原文地址:https://www.cnblogs.com/lpgit/p/9397734.html