zoukankan      html  css  js  c++  java
  • Python随心记--函数之面向对象

    函数之面向对象
    def dog(name,type):
        def jiao(dog):
            ret = '一只%s再叫,哈哈哈' % dog['name']
            return ret
        def chi(dog):
            ret = '一只%s在吃饭,吃吃吃' % dog['type']
            return ret
        def init(name,type):
            dog = {
                'name':name,
                'type':type,
                'jiao':jiao,
                'chi':chi,
            }
            return dog
        return init(name,type)
    
    d1 = dog('小白兔','哈士奇')
    
    d2 = dog('小黑兔','阿拉斯加')
    print(d1['jiao'](d1))
    print(d1['chi'](d1))
    print(d1['jiao'](d2))
    print(d1['chi'](d2))
    #面向对象:
    类:
    动作跟特征的结合(共同的特征,共同的动作)
    把一类事物的相同的特征和动作整合到一起
    是一个抽象的概念
    对象:就是居于类而创建的一个具体的事物
    #用面向对象语言写程序和一个程序的设计是面向对象编程

    #新式类(python2中)
    class School(object):
        def __init__(self,name,type):
            self.name = name
            self.type = type
        def bark(self):
            return '%s在招生' %self.name
    
    d = School('清华','公立')   #实例化对象
    print(d.bark())
    #经典类   (__init__里面不能return值)
    class School:   #声明一个类
        def __init__(self,name,type):
            self.name = name
            self.type = type
        def bark(self):
            return '%s在招生' %self.name
    
    d = School('清华','公立')   #实例化对象
    print(d.bark())

    class Chinese:
        '这是一个中国类'
        nationality = '中国'   #属性
        ancestralhome = '广东'   #属性
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
        def common(self):
            return '%s人不吃辣' %self.name
        def commons(self):
            return '%s人喜欢吃辣' %self
    print(Chinese.__name__)   #打印类名
    print(Chinese.__doc__)   #打印文档
    print(Chinese.__base__)
    print(Chinese.__bases__)
    print(Chinese.__module__)   #模块
    print(Chinese.__class__)
    
    chainese = Chinese()
    print(Chinese.nationality)   #访问属性
    print(Chinese.ancestralhome)   #访问属性
    print(Chinese.common(chainese))   #访问方法
    print(dir(Chinese))
    print(Chinese.__dict__)   #查看类的属性字典
    print(Chinese.__dict__['nationality'])   #打印类的属性
    print(Chinese.__dict__['ancestralhome'])   #打印类的属性
    print(Chinese.__dict__['commons']())   #执行类的方法
    
    chainese = Chinese('广东','13','中国')
    print(chainese.__dict__)
    print(chainese.common())
    class Chinese:
        '这是一个中国类'
        nationality = '中国'   #属性
        ancestralhome = '广东'   #属性
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
        def common(self):
            return '%s人不吃辣' %self.name
        def eatfood(self,food):
            return '%s人喜欢喝%s' %(self.name,food)
    
    chainese = Chinese('广东','13','中国')
    
    print(chainese.common())
    print(chainese.eatfood('早茶'))
    
    Chinese.ancestralhome = '深圳'   #修改属性
    chainese.addr = '广州'   #增加属性
    del Chinese.ancestralhome   #删除属性
    
    def eat_food(self,food):
        return '%s人喜欢喝%s' % (self.name, food)
    
    Chinese.eat = eat_food   #增加方法 把eat_food方法增加到Chinese类中
    Chinese.common = eat_food   #修改 把common方法修改为eat_food
    # print(chainese.__dict__)
    print(chainese.eat(''))
    county = '北京'
    class Chinese:
        '这是一个中国类'
        nationality = '中国'   #属性
        ancestralhome = '广东'   #属性
        def __init__(self,name,age,gender):
            #print(county)   #能打印北京,这里跟普通变量没什么差别,如果用self.county就会报错
            self.name = name
            self.age = age
            self.gender = gender
        def common(self):
            return '%s人不吃辣' %self.name
        def eatfood(self,food):
            return '%s人喜欢喝%s' %(self.name,food)
    
    chainese = Chinese('广东','13','中国')

    面向对象之静态属性

    class Room:
        tag = 1   #静态属性
        def __init__(self,name,length,width,hiegh):
            self.Name = name
            self.Length = length
            self.Width = width
            self.Hiegh = hiegh
        @property   #加上装饰器
        def cal_area(self):
            return self.Width * self.Length
        def test(self):
            print('from test',self.Name)
        def tall_info(self):
            print('--->',self.tag)
    
        @classmethod  # 加上只会tall_info就会变成专门给类使用的方法
        def tall_info1(cls):
            print(cls)
            print('--->', cls.tag)
            print('--->', Room.tag)
    
        @classmethod  # 加上只会tall_info就会变成专门给类使用的方法
        def tall_info2(cls,x):
            print(cls)
            print('--->', cls.tag, x)
    room = Room('卧室',100,100,100)
    print(room.cal_area())   #加上装饰器@property之前调用
    print(room.cal_area)   #加上装饰器@property之后调用
    
    print(Room.tag)   #调用属性
    Room.test(room)
    Room.tall_info(room)   加上装饰器@classmethod之前调用
    
    Room.tall_info1()   #加上装饰器@classmethod之后调用
    Room.tall_info2(10)   #加上装饰器@classmethod之后调用
    
    
    #静态方法
    class Room:
        tag = 1   #静态属性
        def __init__(self,name,length,width,hiegh):
            self.Name = name
            self.Length = length
            self.Width = width
            self.Hiegh = hiegh
        @property   #加上装饰器
        def cal_area(self):
            return self.Width * self.Length
        def test(self):
            print('from test',self.Name)
        def tall_info(self):
            print('--->',self.tag)
    
        @classmethod  # 加上只会tall_info就会变成专门给类使用的方法
        def tall_info1(cls):
            print(cls)
            print('--->', cls.tag)
            print('--->', Room.tag)
    
        @classmethod  # 加上只会tall_info就会变成专门给类使用的方法
        def tall_info2(cls,x):
            print(cls)
            print('--->', cls.tag, x)
        @staticmethod   #类的工具包 不能调用类变量和实例变量
        def wash_boyd():   #可以传参数也可以不传参数
            print('正在洗澡')
    room = Room('卧室',100,100,100)
    
    Room.wash_boyd()
    room.wash_boyd()
    
    
    组合
    class Hand:
        pass
    class Foot:
        pass
    class Head:
        pass
    class Trunk:
        pass
    class Person:
        def __init__(self,id_num,name):
            self.id_num = id_num
            self.name = name
            self.hand = Hand()
            self.food = Foot()
            self.trunk = Trunk()
            self.head = Head()
        
    
    
    组合(查询学校信息)
    #学校类
    class School:
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
    #课程类
    class Course:
        def __init__(self,name,price,perioc,school):
            self.name = name
            self.price = price
            self.perioc = perioc
            self.school = school
    
    schoolo = School('老男孩','北京')
    schoolt = School('传  智','天津')
    schoolh = School('泰  牛','上海')
    
    
    # print(c1.__dict__)
    
    msg = '''
        1 老男孩北京校区
        2 老男孩天津校区
        3 老男孩上海校区
    '''
    while True:
        print(msg)
        menu = {
            '1' : schoolo,
            '2' : schoolt,
            '3' : schoolh,
        }
        choice = input('请选择您想要了解的校区序号>>>:')
    
        course = Course('liunx', '10000', '6', menu[choice])  # 把学校类传给课程类
        print('课程属于【%s】,地址在【%s】' %(course.school.name,course.school.addr))  # 拿到oldboy
    #继承、多态、封装

    继承
     #面向对象之继承
    class ParentClass:
        money = 100
        def __init__(self,name):
            self.name = name
        def hit_son(self):
            return '%s 正在运行' %self.name
    class ParentClasss:
        pass
    class SubClass(ParentClass):   #单继承
        pass
    class SubClasss(ParentClass,ParentClasss):   #多继承
        pass
    
    sub = SubClass('函数')
    # print(sub.money)
    print('子类调用父类的hit_son函数',sub.hit_son()) 
    
    

    接口继承:

      子类必须实现父类的所有方法

    import abc   #接口模块
    class AllFile(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def read(self):
            pass
        @abc.abstractmethod
        def write(self):
            pass
    class Disk(AllFile):
        def read(self):
            print('Disk rand')
        def write(self):
            print('Disk write')
    class Cdrom(AllFile):
        def read(self):
            print('Cdrom rand')
        def write(self):
            print('Cdrom write')
    
    class Mem(AllFile):
        def read(self):
            print('Mem rand')
        def write(self):
            print('Mem write')
    #接口继承顺序之mro线性(python3)
    class D:
        pass
    class E:
        pass
    class F(D,E):
        pass
    print(F.__mro__)
    
    
    #在子类中调用父类的方法
    class Vehicle:
        Country = 'China'
        def __init__(self,name,speed,load,power):
            self.name = name
            self.speed = speed
            self.load = load
            self.power = power
    
        def run(self):
            return '【父类】开动啦............'
    
    
    class Subway(Vehicle):
        def __init__(self,name,speed,load,power):
            super().__init__(name,speed,load,power)
            # super(Subway,self).__init__(name,speed,load,power)
            # Vehicle.__init__(self,name,speed,load,power)
        def show_info(self):
            return self.name,self.speed
        def run(self):
            super().run()
            # Vehicle.run(self)
            return '%s线开动了' %(self.name),super().run()
    lin13 = Subway('深圳13号线','10km/h',1000,'')
    
    print(lin13.show_info())
    
    print(lin13.run())

    实例

    import uuid
    import pickle
    import hashlib
    import time
    def creat_md5():
        m = hashlib.md5()
        m.update(str(time.time()).encode('utf8'))
        return m.hexdigest()
    # id = creat_md5()
    class Base:
        def save(self):   #把实例对象永久化保存(文件方式)
            with open('school.db','wb') as f:
                pickle.dump(self,f)
    class School(Base):
        def __init__(self,name,addr):
            self.id = creat_md5()
            self.name = name
            self.addr = addr
    #课程类
    class Course(Base):
        def __init__(self,name,price,perioc,school):
            self.id = creat_md5()
            self.name = name
            self.price = price
            self.perioc = perioc
            self.school = school
    
    school = School('老男孩','沙河')
    school.save()
    
    school_obj = pickle.load(open('school.db','rb'))   #读出保存的对象
    print(school_obj)
    #面向对象之多态
    
    
    class H2o:
        def __init__(self,name,temperature):
             self.name = name
             self.temperature = temperature
        def turn_ice(self):
            if self.temperature < 0:
                return '【%s】温度太低结冰了' %self.name
            elif self.temperature > 100:
                return '【%s】温度太高变成蒸汽了' % self.name
            else:
                return '【%s】液化成水了' % self.name
    
    class Water(H2o):
        pass
    
    class Ice(H2o):
        pass
    
    class Steem(H2o):
        pass
    
    water = Water('',10)
    ice = Ice('',-20)
    steem = Steem('蒸汽',123)
    
    print(water.turn_ice())
    print(ice.turn_ice())
    print(steem.turn_ice())
    
    
    #面向对象之封装:
    脑子不好使的先别封,没想全面的别封,不然最后你会疯
    1 改变 2 扩展
    明确内外可否调用,内部能用外部不能用
    多态就是类的这两层意义的一个具体的实现机制,即调用不同的类实例化的对象下的相同方法,实现的过程不一样,python中的标准类型就是多态概念的一个很好的示范
    真正意义的封装不是停留在封装的层面上
    
    
    class People:
        stars = 'earth'
        _star = 'earth'   #被隐藏的属性 类之外不应该被调用,能调用
        __star = 'earth'   #被隐藏的属性(类似私有的) 类之外不能被调用 如非要调用可如: peoplo._People__star 原因是pythonn会重命名
        __width = 23
        __lenfth = 24
        def __init__(self,id,name,age,salary):
            self.id = id
            self.name = name
            self.age = age
            self.salary = salary
        def _get_id(self):
            print('这是我的私有方法,我找到的id是[%s]' %self.id)
        
        def teststar():
            print(self.__star#外部人可调用该函数求面积
        def tell_area():
            return self.__width * self.__lenfth
    peoplo = People('232333233','linm','13',1000000)
    peoplo._get_id()
    print(peoplo.__star)
    peoplo.teststar()
    
    
    
     
     
  • 相关阅读:
    string类型版本号比较
    地图
    使用libcurl显示下载进度
    欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告
    [置顶] 两台一级域名相同二级域名不同的服务器,怎么共享session
    [源码分享] HIVE表数据量统计&邮件
    Domino 迁移到Exchange 服务器 之在Domino Server 创建用户!
    Lotus 迁移到Exchange POC 之 新建2007 服务器!
    uva 10056
    Lotus 迁移到Exchange 2010 POC 之在Exchange 2007安装Transport Suite!
  • 原文地址:https://www.cnblogs.com/Essaycode/p/10199080.html
Copyright © 2011-2022 走看看