1.多态

执行的时候才知道调用谁

  1. class Dog(object):
  2. def print_self(self):
  3. print("大家好,我是来自西安的小白")
  4.  
  5. class Xiaotq(object):
  6. def print_self(self):
  7. print("hello everyone,I am jack")
  8.  
  9. def instroduce(temp): #temp传入的dog1 dog2的引用
  10. temp.print_self()
  11.  
  12. dog1 = Dog()
  13. dog2 = Xiaotq()
  14.  
  15. instroduce(dog1)
  16. instroduce(dog2)
  1. 大家好,我是来自西安的小白
  2. hello everyone,I am jack

                    

      

2.面向对象的3要素

封装:把函数和全局变量找个东西封装起来

继承:一个子类 继承父类的功能

多态:定义的时候,不确定调用哪个类中的方法,而是等到真正调用的之后才确定

3.多态的理解

  1)app按钮的字体

    

  2)cf人物

    

3.类属性,实例属性  和 类对象,实例对象

类对象实际上也是在内存开辟一块空间

类属性是公用的

实例属性只是这个实例对象独有的

    1)版本1:创建一个工具,工具数量加1

  1. class Tool(object):
  2.  
  3. #方法
  4. def __init__(self,new_name):
  5. self.name = new_name
  6.  
  7. num = 0
  8. tool1 = Tool("镰刀")
  9. num +=1
  10. tool2 = Tool("锤子")
  11. num +=1
  12. tool3 = Tool("步枪")
  13. num +=1
  14. print(num)

  2)版本2:类属性,共有

  1. class Tool(object):
  2.  
  3. #类属性 共有的
  4. num = 0
  5. #方法
  6. def __init__(self,new_name):
  7. self.name = new_name #self.name 是实例属性 ,实例对象独有的
  8. #对类属性 +1
  9. Tool.num += 1
  10.  
  11. tool1 = Tool("镰刀")
  12. tool2 = Tool("锤子")
  13. tool3 = Tool("步枪")
  14. print(Tool.num)

    

4.类方法,实例方法

  1)版本 1:类方法修改类属性   通过类调用类属性

  1. class Game(object):
  2.  
  3. #类属性 也可以通过类方法进行修改
  4. num = 0
  5.  
  6. #实例方法
  7. def __init__(self): #self 指向实例对象
  8. #实例属性 可以通过公有的实例方法进行修改
  9. self.name = "langwang"
  10.  
  11. #类方法
  12. @classmethod
  13. def add_num(cls): #cls指向类对象
  14. cls.num += 1
  15.  
  16. game1 = Game()
  17. Game.add_num()
  18. print(Game.num)
  1. python@ubuntu:~/pythonS6/python基础08$ python3 15-类方法.py
  2. 1

  2)版本2: 通过实例化对象调用类方法

  1. class Game(object):
  2.  
  3. #类属性 也可以通过类方法进行修改
  4. num = 0
  5.  
  6. #实例方法
  7. def __init__(self): #self 指向实例对象
  8. #实例属性 可以通过公有的实例方法进行修改
  9. self.name = "langwang"
  10.  
  11. #类方法
  12. @classmethod
  13. def add_num(cls): #cls指向类对象
  14. cls.num += 1
  15.  
  16. game1 = Game()
  17. #Game.add_num() #可以通过类的名字调用类方法
  18. game1.add_num() #也可以通过这个类实例化的对象 调用这个类方法
  19. print(Game.num)

5. 静态方法

完成基本的功能,和类没有关系,和实例对象也没有关系

  1)版本1:class类 和 def函数 混用

  1. class Game(object):
  2.  
  3. #类属性 也可以通过类方法进行修改
  4. num = 0
  5.  
  6. #实例方法
  7. def __init__(self): #self 指向实例对象
  8. #实例属性 可以通过公有的实例方法进行修改
  9. self.name = "langwang"
  10.  
  11. #类方法
  12. @classmethod
  13. def add_num(cls): #cls指向类对象
  14. cls.num += 1
  15.  
  16. def print_menu():
  17. print("-"*50)
  18. print("\t穿越火线V34")
  19. print("1.start this game")
  20. print("2. exit the game")
  21. print("-"*50)
  22.  
  23. game1 = Game()
  24. #Game.add_num() #可以通过类的名字调用类方法
  25. game1.add_num() #也可以通过这个类实例化的对象 调用这个列方法
  26. print(Game.num)
  27.  
  28. print_menu()
  1. 1
  2. --------------------------------------------------
  3. 穿越火线V34
  4. 1.start this game
  5. 2. exit the game
  6. --------------------------------------------------

  

  2)版本2:静态方法,和class 和实例对象无关

  1. class Game(object):
  2.  
  3. #类属性 也可以通过类方法进行修改
  4. num = 0
  5.  
  6. #实例方法
  7. def __init__(self): #self 指向实例对象
  8. #实例属性 可以通过公有的实例方法进行修改
  9. self.name = "langwang"
  10.  
  11. #类方法
  12. @classmethod
  13. def add_num(cls): #cls指向类对象
  14. cls.num += 1
  15.  
  16. #静态方法
  17. @staticmethod
  18. def print_menu():
  19. print("-"*50)
  20. print("\t穿越火线V34")
  21. print("1.start this game")
  22. print("2. exit the game")
  23. print("-"*50)
  24.  
  25. game1 = Game()
  26. #Game.add_num() #可以通过类的名字调用类方法
  27. game1.add_num() #也可以通过这个类实例化的对象 调用这个列方法
  28. print(Game.num)
  29.  
  30. #print_menu() #调用函数
  31. Game.print_menu() #通过类 去调用静态方法
  1. 1
  2. --------------------------------------------------
  3. 穿越火线V34
  4. 1.start this game
  5. 2. exit the game
  6. --------------------------------------------------

  

  3)版本3:

  1. class Game(object):
  2.  
  3. #类属性 也可以通过类方法进行修改
  4. num = 0
  5.  
  6. #实例方法
  7. def __init__(self): #self 指向实例对象
  8. #实例属性 可以通过公有的实例方法进行修改
  9. self.name = "langwang"
  10.  
  11. #类方法
  12. @classmethod
  13. def add_num(cls): #cls指向类对象
  14. cls.num += 1
  15.  
  16. #静态方法
  17. @staticmethod
  18. def print_menu():
  19. print("-"*50)
  20. print("\t穿越火线V34")
  21. print("1.start this game")
  22. print("2. exit the game")
  23. print("-"*50)
  24.  
  25. game1 = Game()
  26. #Game.add_num() #可以通过类的名字调用类方法
  27. game1.add_num() #也可以通过这个类实例化的对象 调用这个列方法
  28. print(Game.num)
  29.  
  30. #print_menu() #调用函数
  31. #Game.print_menu() #通过类 去调用静态方法
  32. game1.print_menu() #通过实例对象 去调用静态方法
  1. 1
  2. --------------------------------------------------
  3. 穿越火线V34
  4. 1.start this game
  5. 2. exit the game
  6. --------------------------------------------------

day 5 多态 类 静态的更多相关文章

  1. c++ 宏多态 动态多态和静态多态(转载)

    转载出处:通道 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形.在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关 ...

  2. C++的多态总结(静态&动态)

    什么是多态 顾名思义就是同一个事物在不同场景下的多种形态. 静态多态 我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合 ...

  3. PHP 类属性 类静态变量的访问

    php的类属性其实有两种,一种是类常量,一种是类静态变量.两种容易引起混淆. 如同静态类方法和类实例方法一样,静态类属性和实例属性不能重定义(同名),但静态属性可以和类常量同名. <?php c ...

  4. C++类静态数据成员与类静态成员函数

    from:://http://blog.csdn.net/taina2008/article/details/1684834 把类中的函数都定义成静态函数,这样相当于在编译时就分配了空间,这样不需要实 ...

  5. python类静态变量

    python的类静态变量直接定义在类中即可,不需要修饰符,如: 1 class Test: stc_attr = 1 def __init__(self,attr1,attr2): self.attr ...

  6. 《挑战30天C++入门极限》C++类静态数据成员与类静态成员函数

        C++类静态数据成员与类静态成员函数 在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? ...

  7. 9 python 多态与多态类

    1.多态定义 多态指的是一类事物的多种形态 比如动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractm ...

  8. javascript多态 - 类形式实现demo

    /* *多态 * 对传入的参数做判断以实现多种调用方式 */ //类形式实现 function Add(){ function zero(){ return 10; } function one(nu ...

  9. php访问类静态属性

    在类的外部,如果要使用到类的静态变量,则可以使用 :: 操作符. <?php class A { static $x = 10; function test() { echo self::$x; ...

随机推荐

  1. 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  2. fastjson反序列化TemplatesImpl

    环境参考第一个链接,直接用IDEA打开 编译EvilObject.java成EvilObject.class 先看poc,其中NASTY_CLASS为TemplatesImpl类,evilCode是E ...

  3. 【webpack】config/index.js

    // see http://vuejs-templates.github.io/webpack for documentation. var path = require('path') module ...

  4. WEB安全 php+mysql5注入防御(二)

    第四天: 一.新的注入函数: ascii() substring("string",n,m)                     n>=1 limit n,m      ...

  5. SpringBoot实战(六)之使用LDAP验证用户

    关于ubuntu16.04服务器安装配置LDAP参考链接为:https://www.howtoing.com/how-to-install-and-configure-openldap-and-php ...

  6. 百度Apollo安装说明

    前言:最近在和百度Apollo合作,Apollo的人很nice,大家都在全力帮助我们解决问题.但Apollo系统有点难搞,安装起来很费劲,为了避免再次踩坑,留下笔记,流传后人,O(∩_∩)O. 1. ...

  7. Basic Classifiers and Loss Functions

    Linear Classifier and Hing Loss (or Multiclass SVM Loss) Linear Mapping (Score function) Linear Clas ...

  8. Visual Studio 2017 安装过程问题解决

    VS已经发布了两三天了,我也着手安装,但是折腾了两个晚上,怎么都到不了安装界面(选择模块的界面),各种尝试,各种重启,也并不顶什么卵用~ 后来经过各种查LOG,发现我电脑访问不了https://dow ...

  9. 图形剖析,当给 ul 设置padding=0, margin=0后 li前面的小黑点消失的现象原理!

  10. C++练习 | 在递增序列中查找最后一个小于等于指定数的元素

    #include <iostream> using namespace std; int mid,l0; int solve(int a1[],int l,int r,int x) { & ...