python_面向对象

1.面向对象
类的设计:
1.类名 这类事物的名字,满足大驼峰命名法
2.属性 这类事物具有什么样的特征
3.方法 这类十五具有什么样的行为

class GoodFish():
    def drink(self):
        print '小鱼爱吃鱼'
    def eat(self):
        print '小鱼要喝水'


tonny = GoodFish()
tonny.drink()
tonny.eat()
class GoodFish():
    def __init__(self,Name):
        self.name = Name
        #在类中任何方法都可以使用self.name
        print '%s爱吃鱼' %self.name
    def drink(self):
        print '%s要喝水'%self.name
tom = GoodFish('tom')
#使用类名创建对象的时候会自动调用__init__初始化方法
tom.drink()

内置方法

class Cat():
    def __init__(self,name):
        self.name = name
        print '%s 来了'%self.name
    def __del__(self):
        print '%s 走了'%self.name
tom = Cat('tom')
#del tom
print '^' * 50
#__del__在内存中被销毁之前会执行该方法
class Cat():
    def __init__(self,name):
        self.name = name
        print '%s 来了'%self.name
    def __str__(self):
        return 'i am %s'%self.name
tom = Cat('tom')
print tom
#希望python能够输出对象变量而非内存地址,便可以使用__str__ 要注意的是必须返回一个字符串

面向对象的三大特性
封装:根据职责将属性和方法封装到一个抽象的类中,定义类的准则

class Furniture():
    def __init__(self,name,area):
        self.name = name
        self.area = area
    def __str__(self):
        return '%s 占地 %.2f'%(self.name,self.area)
bed = Furniture('bed',100)
print bed
table = Furniture('table',10)
print table

class House():
    def __init__(self,house_type,area):
        self.house_type = house_type
        self.area = area
        self.free_area = area
        self.furniture = []
    def add_furniture(self,furniture):
        if furniture.area < self.free_area:
            self.furniture.append(furniture.name)
            self.free_area -= furniture.area
        else:
            print '%s 的面积太大 无法进行添加'%furniture.name
    def __str__(self):
        return '该房子的户型为%s,\n面积为%.2f,\n家具%s,\n剩余面积为%.2f'%(self.house_type,self.area,self.furniture,self.free_area)
home = House('两室一厅',200)
home.add_furniture(table)
desk = Furniture('desk',200)
home.add_furniture(desk)
home.add_furniture(bed)
print home

继承:实现代码的重复使用,相同代码不需要重复编写,子类可以根据自己的所需进行重写

class Chicken():
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print 'Aaaa~~~~~~~~~~~'
            self.hungry = False
        else:
            print 'no,thanks'
class SongChicken(Chicken):
    def __init__(self):
        self.song = 'Sqwrqes'
        Chicken.__init__(self)
    def Song(self):
        print self.song
aaa = SongChicken()
aaa.eat()
aaa.Song()

多继承

class A():
    def test(self):
        print 'test ++++++++ A'
    def demo(self):
        print 'demo ++++++++++A'
class B():
    def test(self):
        print 'test +++++B'
    def demo(self):
        print 'demo ________b'
class C(A,B):
#方法名相同时,哪个在前显示哪个
    pass
C = C()
C.demo()
C.test()

多肽:不同的子类,对象调用相同的方法产生不同的效果

# 不同的子类对象调用相同的方法产生不同的结果
class Dog(object):
    def __init__(self,name):
        self.name = name
    def game(self):
        print '%s gou' %self.name
class BigDog(Dog):
    def game(self):
        print '%s run' %self.name
class Person(object):
    def __init__(self,name):
        self.name = name
    def game(self,dog):
        print '%s play with %s '%(self.name,dog.name)
        dog.game()
c = Dog('wor')
q = Person('xiaoming')
q.game(c)
cc = BigDog('DENNY')
Q = Person('xiaoming')
Q.game(cc)

私有属性以及私有方法

class A(object):
    def __init__(self):
        self.num1 = 1
        self.__num2 = 2
    def __demo(self):
        print '%d,%d'%(self.num1,self.__num2)
    def aaa(self):
        print self.__num2
        self.__demo()
class B(A):
    pass
c = B()
c.aaa()

classmethod(类方法):方法内部只需要访问类属性
staticmethod(静态方法):方法内部不需要访问类属性和实例属性

类方法

class Toy():
    count = 0
    @classmethod
    def toy_number(cls):
            print '玩具的数目为%d'%cls.count
    def __init__(self,name):
        self.name = name
        Toy.count += 1

toy1 = Toy('的瓦')
toy2 = '大大'
toy3 = '大卫'
Toy.toy_number()

静态方法

静态方法
在开发时,如果需要在类的封装一个方法,这个方法:
即不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
"""
class Cat(object):
    @staticmethod
    #静态方法不需要传递第一个参数:self
    def call():
        print 'dada~'


Cat.call()

设计模式:

class MusicPlayer(object):
    instance = None
    def __new__(cls, *args, **kwargs):
    #第一个参数cls:哪一个调用,就传递哪一个类
    #第二个参数#args:多值参数
    #第三个参数**kwargs:多值的字典参数
    #创建对象的时候,new方法会被自动调用
    # 重写父类的方法
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance
player1 = MusicPlayer()
print  player1
player2 = MusicPlayer()
print  player2

猜你喜欢

转载自blog.csdn.net/ff12123/article/details/81175200