zoukankan      html  css  js  c++  java
  • python学习总结(面向对象进阶)

    -------------------类属性和实例属性关系-------------------
    1、类属性和实例属性关系
        1、实例属性
            实例对象独有的属性
        2、类属性
            类名访问类属性
        3、实例中无同名属性时,可访问到类属性,当定义同名实例属性时,则无法访问
        4、常用的查找指令
            1、vars :查看实例内属性
            2、dir :显示类属性和所有实例属性
            3、type :显示类型
     
    -------------------方法-------------------
    1、实例方法
        隐含的参数为类实例self
     
    2、类方法
        隐含的参数为类本身cls
     
    3、静态方法
        为隐含参数,主要为了类实例也可以直接调用静态方法
     
    4、类名可以调用类方法和静态方法,但不可以调用实例方法
     
    5、实例:
     class Test(object):
        def instancefun(self):
            print("InstanceFun")
            print(self)
     
        @classmethod
        def classfun(cls):
            print("ClassFun")
            print(cls)
     
        @staticmethod
        def staticfun():
            print("StaticFun")
     
    -------------------私有化-------------------
    1、xx :公有变量
     
    2、_x :单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
     
    3、__xx :双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
     
    4、__xx__ :双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
     
    5、xx__ :单后置下划线,用于避免与Python关键词的冲突
     
    6、示例:
        #人类
        class Person(object):
            def __init__(self,name,age,state):
                self.name = name
                self._age = age
                self.__state = state
     
            def personshow(self):
                print self.name
                print self._age
                print self.__state
     
            def _work(self):
                print('in work')
     
            def __away(self):
                print('in away')
     
        #学生类继承人
        class Student(Person):
            def setInfo(self,name,age,state):
                self.name = name
                self._age = age
                self.__state = state
     
            def studentshow(self):
                print self.name
                print self._age
                print self.__state
     
        #main入口
        if __name__ == '__main__':
            #创建一个人类的对象
            person = Person('xiaohao', 18, 'football')
     
            person.personshow()
     
            #创建一个学生对象
            student = Student('xiaohao', 18, 'football')
     
            student.setInfo('xiaowang',25,'basketball')
     
            student.studentshow()
     
            student.personshow()
     
            person._work()
     
            person._Person__away()
     
    -------------------分析一个类-------------------
    1、__init__
        1、说明 :构造初始化函数
        2、触发条件 :创建实例后,赋值时使用,在new后
     
    2、__new__
        1、说明 :生成实例所需属性
        2、触发条件 :创建实例时
     
    3、__class__
        1、说明 :实例所在的类
        2、触发条件 :实例__class__
     
    4、__str__
        1、说明 :实例字符串表示,可读性
        2、触发条件 :print(类实例),如没实现,使用repr结果
     
    5、__repr__
        1、说明 :实例字符串表示,准确性
        2、触发条件 :类实例 回车 或者 print(repr(类实例))
     
    6、__del__
        1、说明 :析构
        2、触发条件 :del删除实例
     
    7、__dict__
        1、说明 :实例自定义属性
        2、触发条件 :vars(实例 dict)
     
    8、__doc__
        1、说明 :类文档,子类不继承
        2、触发条件 :help(类或实例)
     
    9、__getattribute__
        1、说明 :属性访问拦截器
        2、触发条件 :访问实例属性时,优先级高于__dict__访问
        3、实例 :
            #coding=utf-8
            class Itcast(object):
                    def __init__(self,subject1):
                        self.subject1 = subject1
                        self.subject2 = 'cpp'
     
                    #属性访问时拦截器,打log
                    def __getattribute__(self,obj):
                        if obj == 'subject1':
                            print('log subject1')
                            return 'redirect python'
                        else:   #测试时注释掉这2行,将找不到subject2
                            return object.__getattribute__(self,obj)
     
                    def show(self):
                        print 'this is Itcast'
     
            s = Itcast('python')
            print s.subject1
            print s.subject2
     
    10、__bases__
        1、说明 :类的所有父类构成元素
        2、触发条件 :       
     
    -------------------属性保护-------------------
    1、实例:
        #coding=utf-8
     
        class Man(object):
            def __init__(self, name, age):
                self._name = name
                self._age = age
     
            @property
            def name(self):
                return self._name
     
            @property
            def age(self):
                return self._age
     
            @age.setter
            def age(self, age):
                if not isinstance(age, int):
                    raise ValueError('age should be int')
                if age < 0 or age > 150:
                    raise ValueError('age should be 0-150')
                self._age = age
     
        m = Man('jack', 32)
        print(m.name)
        print(m.age)
        m.age = 40
        print(m.age)
        m.name = 'rose' #此处报错
     
    -------------------面向对象设计-------------------
    1、封装:
     
    2、继承:class Cat(Animle) class Animle(object)
        1、重写
            class Cat(Animle):
                def chi(self):
                    重写
                    Animal.chi(self)
     
    3、多态:
        1、虚方法
        2、抽象方法
        3、接口
        4、示例:
            class Dog(Animal):
                def chi(self):
                    print 'chi'
            def test(animal):
                animal.chi()
            dog = Dog()
            test(dog)
  • 相关阅读:
    PHP 魔术函数
    创建静态链接库
    Linux C 子进程的调度
    Android开发(三) android布局
    谷歌(Google)算法面试题
    Android开发(二) 详细了解android开发
    制作makefile文件
    SHELL编程
    5 Rules For A Good Web Design
    非托管代码方法的命名约定
  • 原文地址:https://www.cnblogs.com/qingtianyu2015/p/5991681.html
Copyright © 2011-2022 走看看