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

 

 
 

 

posted @ 2018-12-30 12:44  爱跑步的乌龟  阅读(256)  评论(0编辑  收藏  举报