面向对象编程

面向对象的编程

类的定义:

class 类名(父类名)

调用类:

类名()

<对其进行实例化对象的过程>

***封装特性***

#定义一个水果类
class Fruit(object):
    #构造函数<实例化对象时自动调用的函数>
    def __init__(self,name,color,price):
        #把对象和属性进行绑定
        self.name=name
        self.color=color
        self.price=price
    #在类里构造的函数称为方法
    def eat(self):
        print('%s味道是甜的'%self.name)


a=Fruit('apple','red','5yuan')
print(a.price)
print(a.name)
print(a.color)
a.eat()



***继承特性***

#定义一个水果类
class Fruit(object):
    def __init__(self,name,color,price):
        self.name=name
        self.color=color
        self.price=price
    def eat(self):
        print('%s味道是甜的'%self.name)


#定义另一个便宜的水果类
class Cheapfruit(Fruit):
    def __init__(self,name,color,price,count):
        #对父类属性的继承
        super(Cheapfruit, self).__init__(name,color,price)
        self.count=count

a=Cheapfruit('apple','red','5yuan',5)
print(a.color)
print(a.count)
a.eat()#子类没有的函数,子动调用父类的函数,子类有的函数优先调用子类的函数



类的多继承:

>新式类(python3)

在某一类存在多个父类的情况下:采用广度优先的原则进行函数的调用

>经典类(python2)

采用深度优先的原则


类的私有属性:

只有该类对该属性有访问和修改的权限


***类的基础练习***

游戏规则:
    1. 游戏背景为10*10;
    2. 游戏会自动生成1个乌龟和10条鱼;
    3. 它们移动方向随机;
    4. 乌龟最大移动能力为2; [-2,-1,1,2]
    5. 鱼最大移动能力为1; [-1,1]
    6. 当移动到场景边界, 自动反方向移动;
    7. 乌龟初始化体能为100<200为上限>;每移动一次消耗体能1;
    8. 当乌龟和鱼的坐标重合, 代表乌龟吃掉鱼, 体能增加20;

    9. 乌龟无体力或者鱼吃光, 游戏结束;


import random


class Base(object):
    def __init__(self):
        self.x = random.randint(0, 9)
        self.y = random.randint(0, 9)

    def is_vaild(self, point):
        if point < 0:
            return 0 - point
        elif point > 9:
            return 9 - (point - 9)
        return point


class Turtle(Base):
    def __init__(self):
        super(Turtle, self).__init__()
        self.power = 100

    def move(self):
        move_skill = [-1, 1, 0, -2, 2]
        new_x = self.x + random.choice(move_skill)
        new_y = self.y + random.choice(move_skill)
        self.x = self.is_vaild(new_x)
        self.y = self.is_vaild(new_y)

        self.power -= 1

    def eat(self):
        self.power += 20
        if self.power >= 200:
            self.power = 200


class Fish(Base):
    def move(self):
        move_skill = [0, 1, -1]
        new_x = self.x + random.choice(move_skill)
        new_y = self.y + random.choice(move_skill)
        self.x = self.is_vaild(new_x)
        self.y = self.is_vaild(new_y)


def main():
    T = Turtle()
    F = [Fish() for i in range(10)]
    while 1:
        if T.power == 0:
            print('乌龟累死了!Game Over!')
            break
        elif F == []:
            print('鱼被吃光了!Game Over!')
            break
        else:
            T.move()
            for fish in F:
                fish.move()
                if fish.x == T.x and fish.y == T.y:
                    T.eat()
                    F.remove(fish)
                    print('一条鱼被吃掉!')
                    print('乌龟剩余体力:%s' % T.power)


if __name__ == '__main__':
    main()



魔术方法


***构造函数,析构函数,__str__***

class house(object):
    #__init__是在实例化对象开始时自动调用的函数
    def __init__(self,high,width,length):
        self.high=high
        self.width=width
        self.length=length
    #__str__是在实例化对象时调用的函数
    def __str__(self):
        return '高:{d.high} 宽:{d.width} 长:{d.length}'.format(d=self)
    #__del__是在调用结束时调用的函数
    def __del__(self):
        print( '谢谢使用...')

print(house('3米','5米','20米'))



***__format__魔术方法对对象的属性进行自定义处理***


info={
    'MNA':'早上:{d.morning}--中午:{d.noon}--下午:{d.afternoon}',
    'ANM':'下午:{d.afternoon}\n中午:{d.noon}\n早上:{d.morning}'
}

class schedule(object):
    def __init__(self,morning,noon,afternoon):
        self.morning=morning
        self.noon=noon
        self.afternoon=afternoon


    def __format__(self, format_spec):
        if not format_spec:
            format_spec='MNA'
        return info[format_spec].format(d=self)

a=schedule('看电视','踢球','学习')
print(format(a,'ANM'))
print(format(a))



***__getitem__,__setitem__,__delitem__***

让实例化对象具有字典的key:value特性或者索引切片特性

eg:

class student(object):

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def __getitem__(self, item):
        #self.__dict__对象的属性为key值 属性的值为value值
        return self.__dict__[item]

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]

a=student('张龙','20',(100,90,80,70))
print(a['name'])
print(a['score'])
a['gender']='男'
print(a['gender'])
del a['score']
print(a.score)





***__itrer__赋予对象可迭代的特性__gt__大小比较魔术__eq__相等魔术@functools.total_ordering模块***

import functools


@functools.total_ordering
class student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def __iter__(self):
        return iter(self.score)

    def __gt__(self, other):
        sum1 = sum(self.score)
        sum2 = sum(other.score)
        return sum1 > sum2

    def __eq__(self, other):
        sum1 = sum(self.score)
        sum2 = sum(other.score)
        return sum1 == sum2


a = student('小明', '19', (67, 54, 86, 94))
b=student('小华','20',(78,34,98,76))
for i in a:
    print(i)
print(a>b)
print(a<=b)


***@property模块将方法变成属性****


class book(object):
    def __init__(self, name, author, state):
        self.name = name
        self.author = author

        self.__state = state

    def __str__(self):
        return 'hello {b.name} hello {b.author}'.format(b=self)

    @property
    def state(self):
        if self.__state == 1:
            return '借出'
        else:
            return '未借出'

    @state.setter
    def state(self, value):
        if value in [0, 1]:
            self.__state = value
        else:
            print('状态只能是0或者1')


B = book('python', 'guido', 1)
print(B)
print(B.state)
#修改属性
B.state = 0
print(B.state)



***类方法和静态方法***


class Date(object):
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def echo(self):
        print("Year:%s\nMonth:%s\nDay:%s" % (self.year, self.month, self.day))

    @classmethod

    #类方法:实例化之前对对象进行处理,返回的是一个处理后的实例化对象
    def str_date(cls, s):
        year, month, day = map(int, s.split('-'))    
        d = cls(year, month, day)
        return d

    #静态方法:独立于整个类
    @staticmethod
    def is_date_legal(s):
        year, month, day = map(int, s.split('-'))    
        return year > 0 and 0 < month <= 12 and 0 < day <= 31

d = Date.str_date('2018-1-4')
d.echo()
print ("合法") if Date.is_date_legal("2018-1-4") else "不合法"

***.format字符串个格式化***

# 通过位置来传参数
print('hello {}'.format('python'))
print('hello {0} hello {1} hello {2} {1}'.format(1, 2, 3, 4))
print('hello {0:.2f} hello {1:.3f} hello {2:.2f} {1:.2f}'.format(1.423, 2.5435, 3.52542, 4))

# 通过key值来传参数

print('hello {max} hello {min}'.format(max='python', min='java'))

# 通过下标来传参数

print('hello {0[2]} {1[0]}'.format([1, 2, 4], (4, 5, 6)))


# 打印对象时子动调用


class book(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return 'hello {b.name} hello {b.age}'.format(b=self)


print(book('wang', '20'))



附录:



***END***

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值