类与类之间的关系
在我们的世界中事物和事物之间总会有一些联系.
在面向对象中. 类和类之间也可以产生相关的关系
1. 依赖关系
执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻的.
随时可以更换另外一个东西来完成此操作

2. 关联关系
在对象里面埋对象
self.girlFriend = girl
1. 一对一关系
你和你的女朋友

self.teach_list = [t1,t2,t3]
2. 一对多关系
一个学校. 一堆老师


类中的关系: 依赖关系是最轻的. 最重的是继承关系. 关联关系是比较微妙的.

self到底是谁?
self:谁调用的就是谁. 类型是根据调用方的对象来进行变换的
super:表示的是父类

特殊成员:
__init__() # 创建对象的时候初始化操作
__call__() # 对象()
__getitem__() # 对象[哈哈]
__setitem__() # 对象[哈哈] = 值
__new__() # 创建对象的时候.开辟内存
__enter__() # with 对象
__exit__() #结束with的时候
__hash__() # 可哈希 hash()
依赖关系
# class Person:
#     def play(self,tools):
#         tools.run()
#         print('很开心,能玩游戏了')
# class Computer:
#     def run(self):
#         print('电脑能运行')
# class Phone:
#     def run(self):
#         print('手机能运行')
#
# c = Computer()
# ph = Phone
#
# p = Person()
# p.play(c)


# 植物大战僵尸  特别 low
# class ZhiWu:
#     def __init__(self, name, xue, gongji):
#         self.name = name
#         self.xue = xue
#         self.gongji = gongji
#     def da(self,jiangshi):
#         print('打%s'% jiangshi)
#     def diaoxue(self, jiangshi):
#         self.xue = self.xue - jiangshi
#         print('植物还有%s血' % self.xue)
#
# class JiangShi:
#     def __init__(self, name, xue, gongji):
#         self.name = name
#         self.xue = xue
#         self.gongji = gongji
#     def chi(self, zhiwu):
#         print('吃%s'% zhiwu)
#     def diaoxue(self, zhiwu):
#         self.xue = self.xue - zhiwu
#         print("僵尸还有%s血" % self.xue)
#
# zhiwu = ZhiWu('豌豆射手', 200, 50)
#
# jiangshi = JiangShi('铁桶僵尸', 500, 60)
#
# zhiwu.da(jiangshi.name)
# jiangshi.diaoxue(zhiwu.gongji)
# zhiwu.da(jiangshi.name)
# jiangshi.diaoxue(zhiwu.gongji)
#
# jiangshi.chi(zhiwu.name)
# zhiwu.diaoxue(jiangshi.gongji)
# jiangshi.chi(zhiwu.name)
# zhiwu.diaoxue(jiangshi.gongji)

  

关联关系
# class Boy:
#     def __init__(self, name, girlFriend = None):
#         self.girlFriend = girlFriend
#
#     def chi(self):
#         if self.girlFriend:
#             print(f'带着他的女朋友{self.girlFriend.name}去吃饭')
#         else:
#             print('单身狗,也得吃')
#     def movie(self):
#         if self.girlFriend:
#             print(f'带着他的女朋友{self.girlFriend.name}去看电影')
#         else:
#             print('单身狗,也得看')
#
# class Girl:
#     def __init__(self, name):
#         self.name = name




# 学校与老师的列子
class School:
    def __init__(self, name):
        self.teach_list = []

    def zhaopin(self,teach):
        self.teach_list.append(teach)

    def shangke(self):
        for i in self.teach_list:
            i.work()

class Teacher:
    def __init__(self,name):
        self.name = name
    def work(self):
        print("%s老师在上课" % self.name)

sch = School("lnh")

t1 = Teacher('牛1')
t2 = Teacher('牛2')
t3 = Teacher('牛3')
t4 = Teacher('牛4')
t5 = Teacher('牛5')
t6 = Teacher('牛6')
t7 = Teacher('牛7')

sch.zhaopin(t1)
sch.zhaopin(t2)
sch.zhaopin(t3)
sch.zhaopin(t4)
sch.zhaopin(t5)
sch.zhaopin(t6)
sch.zhaopin(t7)

sch.shangke()

  

继承关系
# class Base:
#     def chi(self):
#         print('我会吃')
#
# # 派生类 => 子类
# class Foo(Base):  #继承了Base类,Foo类是对Base的一个扩展
#     def he(self):
#         print('我会喝')
#
# f = Foo()
# f.chi()
# f.he()

# class Cat:  # 父类 =>基类 =>超类
#     def catch_mouse(self):
#         print('猫可以抓老鼠')
#
# class BosiCat(Cat):  # 子类 => 派生类
#     pass
#


# class Foo:
#     pass
# print(hash(Foo))   # 可哈希
# print(hash(Foo())
# 我们写好的类,和创建的对象默认都是可哈希的

# 去掉可哈希
# class Foo:
#     __hash__ = None  # 当前类的对象不可哈希
# print(hash(Foo))    # 可哈希
# print(hash(Foo()))  # unhashable type: 'Foo'



# class Foo:
#     def chi(self,food):
#         print('我爱吃鱼和', food)
#
# class Bar:
#     def chi(self,food):
#         print('我爱吃肉和', food)
# dic = {Foo: '鸡蛋', Bar: '香肠'}
#
# for k, v in dic.items():
#     k().chi(v)

# 类名  => 变量名 -> 为了今天作业

# class Base:
#     def __init__(self, num):
#         self.num = num
#     def func1(self):
#         print(self.num)
# class Foo(Base):
#     pass
# obj = Foo(123)
# obj.func1()



# class Base:
#     def __init__(self, num):
#         self.num = num
#     def func1(self):
#         print(self.num)
#
# class Foo(Base):
#     def func1(self):
#         print("Foo. func1", self.num)
#
# obj = Foo(123)
# obj.func1()


# class Base:
#     def __init__(self, num):
#         self.num = num
#     def func1(self):
#         print(self.num)
#         self.func2()
#     def func2(self):
#         print("Base.func2")
#
# class Foo(Base):
#     def func2(self):
#         print("Foo.func2")
# obj = Foo(123)
# obj.func1()



# class Base:
#     def __init__(self, num):
#         self.num = num
#
#     def func1(self):
#         print(self.num)
#         self.func2()
#
#     def func2(self):
#         print(111, self.num)
#
# class Foo(Base):
#      def func2(self):
#         print(222, self.num)
#
# lst = [Base(1), Base(2), Foo(3)]
# for obj in lst:
#  obj.func2()



# class Base:
#     def __init__(self, num):
#         self.num = num
#     def func1(self):
#         print(self.num)
#         self.func2()
#     def func2(self):
#         print(111, self.num)
#
# class Foo(Base):
#     def func2(self):
#         print(222, self.num)
#
# lst = [Base(1), Base(2), Foo(3)]
# for obj in lst:
#     obj.func1()

  

特殊成员
#
class Foo:
    # def __init__(self): # 初始化操作
        # print("我是init,  我是老二")
        # print("初始化操作. 在创建对象的时候自动调用这个方法")
#
#     def __new__(cls, *args, **kwargs): # 创建, 它是真正的构造方法,  可以开辟内存
#         print("我是new. 我是老大")
#         return object.__new__(cls)
#
#
#     # 为了 对象()
#     def __call__(self, *args, **kwargs):
#         print("我是对象()")
#
#     # 对象[]
    def __getitem__(self, item):
        print("item=",item)
        print("你执行了__getitem__")
        return "哈哈"
#
#     # 对象[key] = value
#     def __setitem__(self, key, value):
#         print("key, ", key)
#         print("value, ", value)
#
#     # del lst[1]
#     def __delitem__(self, key):
#         print("key=", key)
#
#     # with 对象:
#     def __enter__(self):
#         print("我是enter")
#
#     # with 对象: 代码执行完毕. 最后执行这里
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         print("我叫exit")
#
#     def __len__(self):
#         print("我的天哪")
#         return 3
#
#
f = Foo()    # 自动执行__init__()
# f() # 调用-> __call__()
# print(callable(f)) # 对象()

print(f["李嘉诚"]) # 自动调用__getitem__()
f['jay'] = "林俊杰"

# del f['哈哈']

# with f:
#     print("我是哈哈哈哈")

# with open() :


# lst = ["孙艺珍", "李金珠", "井柏然"]
#
# lst[2] # =>自动的调用__getitem__()


# def func():
#     pass
# func = 3
# print(callable(func)) # 判断xxx是否是可调用的

#
# f.__init__()  # 第一次这么写. 以后别这么写
# lst = [1,2,3,4]
# it = iter(lst)
#
# print(it.__next__())
#
# print(next(it)) # __next__()

# 面试之前翻一番
# 写出15个特殊成员, 并给出具体作用

# class H:
#     country = "大清"
#
# print(H.country)

# 面向对象编程的执行流程 ->
# 1. 加载类 -> 给类创建一个名称空间 -> 主要存放类变量.
# 2. 创建对象 -> 先找类. -> 根据类来开辟内存 -> 执行类中的__new__()  -> 执行__init__()  -> 返回对象



class Student:
    def __init__(self, name, no, gender, cls, age):
        self.name = name
        self.no = no
        self.gender = gender
        self.cls = cls
        self.age = age


    # 这个对象字符串的表示.
    def __str__(self): # 返回该对象的字符串表示形式
        return f"{self.name}, {self.no}, {self.gender}"

    def __repr__(self): # 该对象的官方的字符串表示形式
        return f"{self.name}, {self.no}, {self.gender}"


s = Student("董仲浩", "3", "男", "S18", "31")
print(s)

  

posted on 2018-12-27 21:46  YangWenYu  阅读(181)  评论(0编辑  收藏  举报