zoukankan      html  css  js  c++  java
  • python 面向对象

    
    
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-

    #class是关键字,Animal是类名
    #类名首字母大写(规范)
    #定义类里面的方法,方法要传入一个self参数进去
    #self代表的就是实例本身,也就是对象本身
    #cat.name 这是实例的属性 ;cat.cry()实例的方法
    #封装:通过构造函数将信息封装到实例中去,通过实例字段取出来
    class Animal:
    def __init__(self,name,age):
    self.name = name
    self.age = age
    def cry(self):
    print('%s在叫' % self.name)
    def nianling(self):
    print('%sis..' %self.age)
    #Dog类 继承了 Animal类
    #继承就是父类有什么,子类就有什么
    #方法的重写(在子类中重新定义了父类的方法)
    class Dog(Animal):
    def cry(self):
    print("汪汪汪叫。。。")
    class Cat(Animal):
    def cry(self):
    print('喵喵叫。。。')
    #创建一个对象(实例)
    #变量 = 类名()
    cat = Cat('kitty','23')
    #实例化一个dog
    dog = Dog('wangcai','22')
    #执行一个方法
    cat.cry()
    #cat.nianling()
    dog.cry()
    #访问实例变量
    #print(cat.name)
    #print(cat.age)
    #多态
    def f(obj):
    obj.cry()

    f(cat)
    f(dog)


    #############存放家具oop例子################
    #!/usr/bin/env python
    #-*-coding:utf-8 -*-
    
    class Home:
        def __init__(self,area,addr,info):
            self.area = area
            self.addr = addr
            self.info = info
            self.left_area = area
            self.contain = []
        def __str__(self):
            msg = '房子的总面积:%d 房子的可用面积:%d 房子的地址:%s 房子的户型:%s' % (self.area,self.left_area,self.addr,self.info)
            msg += '当前房子里的家具有:%s' %(str(self.contain))
            return msg
        def add_item(self,item):
            #self.left_area -= item.size
            #self.contain.append(item.name)
            self.left_area -= item.get_size()
            self.contain.append(item.get_name())
    
    class Bed:
        def __init__(self,name,size):
            self.name = name
            self.size = size
        def __str__(self):
            return '%s床的大小是%d平米' %(self.name,self.size)
        def get_size(self):
            return self.size
        def get_name(self):
            return self.name
    house = Home(129,'厦门 金山小区','三室一厅')
    print(house)
    
    bed1 = Bed('席梦思',4)
    print(bed1)
    
    house.add_item(bed1)
    print(house)
    
    bed2 = Bed('双床',3)
    house.add_item(bed2)
    print(house)
    
    

     

     ###############03-私有方法##############

    在方法面前加“__”两个下划线就是私有方法,私有方法直接调用,会报错:

    dog.__send_msg()
    AttributeError: 'Dog' object has no attribute '__send_msg'

    私有方法的好处是:不想让他人直接调用的方法获取直接数据,满足我的条件,才调用,例如:

    ############04-__del__方法##############

    ###############测量一个对象的引用数量################

    In [1]: import sys
    
    In [3]: class Dog:
       ...:     pass
       ...: dog = Dog()
       ...: sys.getrefcount(dog)
       ...: 
    Out[3]: 2
    
    In [4]: tt = dog
    
    In [5]: class Dog:
       ...:     pass
       ...: dog = Dog()
       ...: sys.getrefcount(dog)
       ...: 
    Out[5]: 2
    
    In [6]: tt = dog
    
    In [7]: sys.getrefcount(dog)
    Out[7]: 3
    
    In [8]: del tt
    
    In [9]: sys.getrefcount(dog)
    Out[9]: 2

    #############方法的重写###################

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Animal:
        def eat(self):
            print('吃...')
        def drink(self):
            print('喝...')
        def sleep(self):
            print('睡...')
    class Dog(Animal):
        def jiao(self):
            print('吠吠...')
    class Cat(Dog):
        def jiao(self):
            print('叫叫...')
            #Dog.jiao(self)    ###既想要自己jiao方法的功能,又需要加上父类的jiao方法的,需加上self
            super().jiao()
            #第一种调用被重写的父类的方法
            #Dog.jiao(self)
    
            #第二种调用被重写的父类的方法
            #super().jiao()
    
    cat = Cat()
    cat.jiao()

    结果:

     ###################私有方法和私有属性在继承中的表现##############

     ###############多继承##############

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Base(object):
        def test(self):
            print('---base')
    class A(Base):
        def test1(self):
            print('---A')
    class B(Base):
        def test2(self):
            print('---B')
    class C(A,B):
        pass
    
    c = C()
    c.test()
    c.test1()
    c.test2()
    

    结果:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Base(object):
        def test(self):
            print('---base')
    class A(Base):
        def test(self):
            print('---A')
    class B(Base):
        def test(self):
            print('---B')
    class C(A,B):
        def test(self):
            print('---C')
    
    c = C()
    c.test()
    print(C.__mro__)

    结果:

    当继承中有多个方法的名字一样,调用哪一个呢?可以用print(类名.__mro__) 查看调用的优先级

    ###################多态########################

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Dog(object):
        def print_self(self):
            print('大家好,我是xxxx,以后多多关照')
    class Xiaotq(Dog):
        def print_self(self):
            print('hello,everybody,我是你们的老大,我是xxxx')
    
    def introduce(tmp):
        tmp.print_self()
    
    dog1 = Dog()
    dog2 = Xiaotq()
    
    introduce(dog1)
    introduce(dog2)

    提示:面向对象的三要素:封装,继承,多态

    ###############类属性,实例属性##############

    ###############类方法,实例方法,静态方法#############

     #######################__new__方法 #######################

    其他语言的构造方法:既包含初始化和创建(但python 不一样),python的__new__ 方法创建,__init__初始化,两个方法是分开的

    ##############创建单实例####################

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Dog(object):
        __instance = None
        def __new__(cls):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                return cls.__instance
    
    dog1 = Dog()
    print(id(dog1))
    dog2 = Dog()
    print(id(dog2))

    结果:

    ##############只初始化一次对象################

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class Dog(object):
        __instance = None
        __init_flag = False
        def __new__(cls,name):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                return cls.__instance
        def __init__(self,name):
            if Dog.__init_flag == False:
                self.name = name
                Dog.__init_flag = True
    
    dog1 = Dog('test1')
    print(id(dog1))
    print(dog1.name)
    dog2 = Dog('test2')
    print(id(dog2))
    print(dog2.name)

    结果:

  • 相关阅读:
    mysql查找有某列但没有此列索引的表
    mysql找到所有索引
    mysq在某一刻同时获取主从库的位置点
    新书《深入应用C++11:代码优化与工程级应用》出版,感谢支持
    c++11实现一个简单的lexical_cast
    应该用bind+function取代虚函数吗?
    《深入应用C++11:代码优化与工程级应用》开始发售
    一个更好的C++序列化/反序列化库Kapok
    C++技术沙龙主要内容
    C++11模版元编程
  • 原文地址:https://www.cnblogs.com/shanhua-fu/p/7612148.html
Copyright © 2011-2022 走看看