A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】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)

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马