# class Person:
 #     def play(self, tools): # 通过参数的传递把另外一个类的对象传递进来
 #         tools.run()
 #         print("很开心, 我能玩儿游戏了")
 #
 #
 # class Computer:
 #     def run(self):
 #         print("电脑开机. 可以运行")
 #
 # class Phone:
 #     def run(self):
 #         print("手机开机, 可以运行")
 #
 #
 # c = Computer()
 # phone = Phone()
 #
 # p = Person()
 # p.play(phone)

 # 写一个植物大战僵尸
 # 1. 植物
 #       打僵尸. 僵尸掉血
 # 2. 僵尸
 #       吃植物. 植物掉血

 class Plant:

         self.name = name
         self.hp = hp
         self.ad = ad

     def attack(self, js):
         print("植物攻击僵尸")
         js.hp -= self.ad
         print(f"僵尸掉血{self.ad}, 还剩下{js.hp}")

 class JiangShi:
     def __init__(self, name, hp, ad): # 1000  800
         self.name = name
         self.hp = hp
         self.ad = ad

     def attack(self, zw):
         print("僵尸咬植物")
         zw.hp -= self.ad
         print(f"植物掉血{self.ad}, 还剩{zw.hp}")

 # 植物
 wd = Plant("歪脖子豌豆", 10, 20)
 # 僵尸
 js = JiangShi("铁桶僵尸", 200, 1)
 wd.attack(js)
 wd.attack(js)
 wd.attack(js)
 wd.attack(js)
 wd.attack(js)

 js.attack(wd)
 js.attack(wd)
 js.attack(wd)
 js.attack(wd)
# 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
#
# b = Boy("宝浪")
# g = Girl("孙艺珍")
# b.chi()
#
# # alex给包浪介绍了一个女朋. 孙艺珍
# b.girlFriend = g
# b.chi()
#
# g2 = Girl("梁咏琪")
# b.girlFriend = g2 # 换了个女朋友
# b.chi()

class School:

    def __init__(self, name):
        self.teach_list = [] # 这里要装多个老师
        self.name = name

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

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

class Teacher:
    def __init__(self, name):
        self.name = name
    def work(self):
        print(f"{self.name}在上课")

lnh = School("老男孩")
t1 = Teacher("武sir")
t2 = Teacher("太白")
t3 = Teacher("哪吒")
t4 = Teacher("女神")
t5 = Teacher("日天")
t6 = Teacher("宝浪")

lnh.zhaopin(t1)
lnh.zhaopin(t2)
lnh.zhaopin(t3)
# 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())) # TypeError: 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)

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

# def func():
#     pass
#
# an = func
#
# an()

# 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()

lnh.zhaopin(t4)
lnh.zhaopin(t5)
lnh.zhaopin(t6)

lnh.shangke()
#
# 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(")
print(s)


python-面向对象:类与类之间的关系和特殊成员的更多相关文章

  1. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  2. python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系

    https://www.cnblogs.com/liubing8/p/11308127.html 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 ...

  3. JAVA面向对象-----接口与类、接口之间的关系

    接口与类.接口之间的关系 大家之前都知道类与类之间的关系继承,那么接口与类之间又是怎样子的关系呢? 接口与类之间是实现关系.非抽象类实现接口时,必须把接口里面的所有方法实现.类实现接口用关键字impl ...

  4. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  5. PHP类和对象之间的关系

    类是对象的描述: 类和对象之间的关系类似于建房子的图纸和房子: 创建类--new对象--用对象: 一.对象的两个特性: --对象的行为(功能):可以对对象施加操作,例如,电视机的开.关.转换频道: - ...

  6. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...

  7. python包管理工具他们之间的关系

    python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...

  8. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  9. Python面向对象1:类与对象

    Python的面向对象- 面向对象编程 - 基础 - 公有私有 - 继承 - 组合,Mixin- 魔法函数 - 魔法函数概述 - 构造类魔法函数 - 运算类魔法函数 # 1. 面向对象概述(Objec ...

  10. Python面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

随机推荐

  1. 队列ADT

    队列 队列是FIFO表,使用队列时在队尾(rear)插入元素,称之为入队(enqueue),以及在对头(front)删除并返回元素值,称之为出队(dequeue). 任何表的实现都可以用于实现队列结构 ...

  2. MySQL数据排序asc、desc

    数据排序 asc.desc1.单一字段排序order by 字段名称 作用: 通过哪个或哪些字段进行排序 含义: 排序采用 order by 子句,order by 后面跟上排序字段,排序字段可以放多 ...

  3. 【题解】Luogu P2730 魔板

    蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...

  4. Docker Kubernetes 介绍 or 工作原理

    Kubernetes 介绍 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容 ...

  5. Docker Kubernetes 容器重启策略

    Docker Kubernetes 容器重启策略 当容器被创建时,容器会根据重启策略来进行容器重启. 支持三种策略: Always:当容器终止退出后,总是重启容器,默认策略. OnFailure:当容 ...

  6. postman+linux+pistache的http通信过程

    一.pistache配置 1.安装cmake[https://www.cnblogs.com/judes/p/10327638.html] 2.下载pistache[git:https://githu ...

  7. Ubuntu如何自定义tftp服务根目录

    答:修改/etc/default/tftpd-hpa中的TFTP_DIRECTORY即可,默认TFTP_DIRECTORY="/var/lib/tftpboot"

  8. P4512 【模板】多项式除法

    思路 多项式除法板子 多项式除法 给出\(A(x)\)和\(B(x)\),求一个\(n-m\)次的多项式\(D(x)\),一个\(m-1\)次多项式\(R(x)\),满足 \[ A(x)=B(x)D( ...

  9. Navicat Premium 12激活

    大自然的搬运工:https://www.jianshu.com/p/5f693b4c9468 声明:本文所提供的所有软件均来自于互联网,个人存放在此作为备用,以备将来不时之需,同时作为大家的分享和学习 ...

  10. 【SMTP】常见错误码

    '* 邮件服务返回代码含义 '* 500 格式错误,命令不可识别(此错误也包括命令行过长) '* 501 参数格式错误 '* 502 命令不可实现 '* 503 错误的命令序列 '* 504 命令参数 ...