zoukankan      html  css  js  c++  java
  • day19

     

    1.面向对象的基本格式

    面向对象的三大特性:封装/继承/多态

    # ###### 定义类 ###### 
    class 类名:
       def 方法名(self,name):
           print(name)
           return 123
       def 方法名(self,name):
           print(name)
           return 123
       def 方法名(self,name):
           print(name)
           return 123
    # ###### 调用类中的方法 ######
    # 1.创建该类的对象
    obj = 类名()
    # 2.通过对象调用方法
    result = obj.方法名('alex')
    print(result)

    应用场景:遇到很多函数,需要给函数进行归类和划分。 【封装】

    封装

    class File:
       def read(self):
           pass
       def write(self):
           pass
    class Person:
       def __init__(sef,name,age):
           self.name = name
           self.age = age
    p = Person('alex',19)

    2.对象的作用

    存储一些值,以后方便自己使用。

    class File:
       def read(self):
           with open(self.xxxxx, mode='r', encoding='utf-8') as f:
               data = f.read()
           return data

       def write(self, content):
           with open(self.xxxxx, mode='a', encoding='utf-8') as f:
               f.write(content)

    # # 实例化了一个File类的对象
    obj1 = File()
    # # 在对象中写了一个xxxxx = 'test.log'
    obj1.xxxxx = "test.log"
    # # 通过对象调用类中的read方法,read方法中的self就是obj。
    # # obj1.read()
    obj1.write('alex')


    # 实例化了一个File类的对象
    obj2 = File()
    # 在对象中写了一个xxxxx = 'test.log'
    obj2.xxxxx = "info.txt"
    # 通过对象调用类中的read方法,read方法中的self就是obj。
    # obj2.read()
    obj2.write('alex')
    class Person:
       def show(self):
           temp = "我是%s,年龄:%s,性别:%s " %(self.name,self.age,self.gender,)
           print(temp)
           

    p1 = Person()
    p1.name = '李邵奇'
    p1.age = 19
    p1.gender = '男'
    p1.show()

    p2 = Person()
    p2.name = '利奇航'
    p2.age = 19
    p2.gender = '男'
    p2.show()
    class Person:
       def __init__(self,n,a,g): # 初始化方法(构造方法),给对象的内部做初始化。
           self.name = n
           self.age = a
           self.gender = g

       def show(self):
           temp = "我是%s,年龄:%s,性别:%s " % (self.name, self.age, self.gender,)
           print(temp)

    # 类() 实例化对象,自动执行此类中的 __init__方法。
    p1 = Person('李兆琪',19,'男')
    p1.show()

    p2 = Person('利奇航',19,'男')
    p2.show()

    总结:将数据封装到对象,方便使用。

    # 1. 循环让用户输入:用户名/密码/邮箱。 输入完成后再进行数据打印。
    # ########## 以前的写法
    USER_LIST = []
    while True:
       user = input('请输入用户名:')
       pwd = input('请输入密码:')
       email = input('请输入邮箱:')
       temp = {'username':user,'password':pwd,'email':email}
       USER_LIST.append(temp)
    for item in USER_LIST:
       temp = "我的名字:%s,密码:%s,邮箱%s" %(item['username'],item['password'],item['email'],)
       print(temp)
       
    # ########## 面向对象写法

    class Person:
       def __init__(self,user,pwd,email):
           self.username = user
           self.password = pwd
           self.email = email


    while True:
       user = input('请输入用户名:')
       pwd = input('请输入密码:')
       email = input('请输入邮箱:')
       p = Person(user,pwd,email)
       USER_LIST.append(p)
    USER_LIST = [对象(用户/密码/邮箱),对象(用户/密码/邮箱),对象(用户/密码/邮箱)]
    for item in USER_LIST:
       temp = "我的名字:%s,密码:%s,邮箱%s" %(item.username,item.password,item.email,)
       print(temp)

    # ########## 面向对象写法

    class Person:
       def __init__(self,user,pwd,email):
           self.username = user
           self.password = pwd
           self.email = email
           
    def info(self):
           return "我的名字:%s,密码:%s,邮箱%s" %(item.username,item.password,item.email,)
       
    USER_LIST = [对象(用户/密码/邮箱),对象(用户/密码/邮箱),对象(用户/密码/邮箱)]
    while True:
       user = input('请输入用户名:')
       pwd = input('请输入密码:')
       email = input('请输入邮箱:')
       p = Person(user,pwd,email)
       USER_LIST.append(p)

    for item in USER_LIST:
       msg = item.info()
       print(msg)

    3.游戏开发示例

    class Police:
    def __init__(self,name)
    self.name = name
            self.hp = 10000
       
       def tax(self):
           msg = "%s收了个税。" %(self.name,)
           print(msg)

       def fight(self):
           msg = "%s去战了个斗。" %(self.name,)

    lsq = Police('李邵奇')
    zzh = Police('渣渣会')
    tyg = Police('堂有光')


    class Bandit:
       def __init__(self,nickname)
    self.nickname = nickname
    self.hp = 1000

       def murder(self,name):
           msg = "%s去谋杀了%s" %(self.nickname, name,)
           
           
    lcj = Bandit('二蛋')
    lp = Bandit('二狗')
    zsd = Bandit('狗蛋')

    # 1. 二狗去谋杀渣渣会,二狗生命值-100; 渣渣会生命值减5000
    lp.murder(zzh.name)
    lp.hp = lp.hp - 100
    zzh.hp = zzh.hp - 5000
    # ...
    class Police:
    def __init__(self,name)
    self.name = name
            self.hp = 10000
       
       def dao(self,other):
           msg = "%s个了%s一刀。" %(self.name,other.nickname)
           self.hp = self.hp - 10
           other.hp = other.hp - 50
           print(msg)

       def qiang(self):
           msg = "%s去战了个斗。" %(self.name,)
           
    def quan(self,other):
           msg = "%s个了%s一全。" %(self.name,other.nickname)
           self.hp = self.hp - 2
           other.hp = other.hp - 10
           print(msg)
           
           
    class Bandit:
       def __init__(self,nickname)
    self.nickname = nickname
    self.hp = 1000

       def qiang(self,other):
           msg = "%s个了%s一全。" %(self.nickname,other.name)
           self.hp -= 20
           other.hp -= 500
       

    lcj = Bandit('二蛋')


    lsq = Police('李邵奇')
    lsq.dao(lcj)
    lsq.quan(lcj)
    lcj.qiang(lsq)

    4.继承

    # 父类(基类)
    class Base:
        def f1(self):
            pass
    # 子类(派生类)
    class Foo(Base):
        def f2(self):
            pass
    
    # 创建了一个字类的对象
    obj = Foo()
    # 执行对象.方法时,优先在自己的类中找,如果没有就是父类中找。
    obj.f2()
    obj.f1()
    
    # 创建了一个父类的对象
    obj = Base()
    obj.f1()

    问题:什么时候才能用到继承?多个类中如果有公共的方法,可以放到基类中避免重复编写。

    class Base:
        def f1(self):
            pass
        
    class Foo(Base):
        def f2(self):
            pass
        
    class Bar(Base):
        def f3(self):
            pass
    
    obj1 = Foo()
    
    obj2 = Bar()

    继承关系中的查找方法的顺序:

    # 示例一
    class Base:
       def f1(self):
           print('base.f1')
           
    class Foo(Base):
       def f2(self):
           print('foo.f2')
           
    obj = Foo()
    obj.f1()
    obj.f2()

    # 示例二
    class Base:
       def f1(self):
           print('base.f1')
           
    class Foo(Base):
       def f2(self):
           self.f1()
           print('foo.f2')
           
    obj = Foo()
    obj.f2()

    # 示例三
    class Base:
       def f1(self):
           print('base.f1')
           
    class Foo(Base):
       def f2(self):
           self.f1()
           print('foo.f2')
    def f1(self):
           print('foo.f1')
           
    obj = Foo()
    obj.f2()

    # 示例四
    class Base:
       def f1(self):
           self.f2()
           print('base.f1')
    def f2(self):
           print('base.f2')
    class Foo(Base):
       def f2(self):
           print('foo.f2')
           
    obj = Foo()
    obj.f1()

    # 示例五
    class TCPServer:
       pass
    class ThreadingMixIn:
       pass
    class ThreadingTCPServer(ThreadingMixIn, TCPServer):
       pass

    # 示例六
    class BaseServer:
       def serve_forever(self, poll_interval=0.5):
           self._handle_request_noblock()
    def _handle_request_noblock(self):
           self.process_request(request, client_address)
           
    def process_request(self, request, client_address):
           pass
       
    class TCPServer(BaseServer):
       pass

    class ThreadingMixIn:
       def process_request(self, request, client_address):
           pass
       
    class ThreadingTCPServer(ThreadingMixIn, TCPServer):
       pass

    obj = ThreadingTCPServer()
    obj.serve_forever()

    注意事项:

    • self 到底是谁?

    • self 是哪个类创建的,就从此类开始找,自己没有就找父类。

    5.多态(多种形态/多种类型)鸭子模型

    # Python
    def func(arg):
       v = arg[-1] # arg.append(9)
       print(v)

    # java
    def func(str arg):
       v = arg[-1]
       print(v)

    面试题:什么是鸭子模型。

    对于一个函数而言,Python对于参数的类型不会限制,那么传入参数时就可以是各种类型,在函数中如果有例如:arg.send方法,那么就是对于传入类型的一个限制(类型必须有send方法)。
    这就是鸭子模型,类似于上述的函数我们认为只要能呱呱叫的就是鸭子(只有有send方法,就是我们要想的类型)
  • 相关阅读:
    Python 使用正则表达式匹配URL网址
    第3章 网络爬虫基础
    《精通Python网络爬虫》
    /etc/hosts
    Linux alias 命令
    file()
    Win10 取消桌面快捷键图标
    Win10 我的电脑 -- 右键点击管理打不开
    MongoDB 备份恢复
    ORACLE 日期比较
  • 原文地址:https://www.cnblogs.com/usherwang/p/12916542.html
Copyright © 2011-2022 走看看