面向对象能做什么和特性及嵌套

面向对象帮我们解决什么问题?

  面向对象的风封装的这个特性帮助我们解决了两个问题

    1.归类: 将方法和静态变量放置到一个类中
    2.打包: 将数据打包到一个对象

 

面向对象的三大特性

封装,继承,多态

  1.封装: 帮我们解决一些方法和属性进行分类,让代码更加的清晰,提高可读性提高

  2.继承: 提高代码的复用性,将具有相同的属性和方法提取出来

  3,多态: python原生支持多态,崇尚鸭子模型,由于python函数传参时,无需指定参数类型

对于对象(self)的跟踪: 

self参数是这实例化的过程中帮助我们自动传递的.所以在继承中是,对于结果的输出时.要看self是谁的对象空间,这会才能确定输出的结果是谁

在python中支持多继承,这会对抽象类和接口类的使用会提供很大的帮助

类中的成员

分成三类:

  1.变量:

    1.实例变量(又可以说是字段):1),公有实例变量2),私有实例变量

实例一:
                        class Foo:
                            # 类变量(静态字段)
                            country = "中国"
                            
                            def __init__(self,name):
                                # 实例变量(字段)
                                self.name = name  
                            
                            
                            def func(self):
                                pass
                
                
                        obj1 = Foo('阿童木')
                        obj2 = Foo('葫芦娃')
                        
                        Foo.country

    2.类变量: 1),公有类变量2),私有类变量

无法访问:
                        class Base(object):
                            __secret = "受贿"

                        class Foo(Base):

                            def func(self):
                                print(self.__secret)
                                print(Foo.__secret)


                        obj = Foo()
                        obj.func()
                                        
可以访问:
                        class Base(object):
                            __secret = "受贿"

                            def zt(self):
                                print(Base.__secret)


                        class Foo(Base):

                            def func(self):
                                print(self.__secret)
                                print(Foo.__secret)


                        obj = Foo()
                        obj.zt()

  2.方法:

    实例方法

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

                            # 实例方法
                            def func(self):
                                print(self.name)
                                
                        obj = Foo('..')
                        obj.func()

    静态方法

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

                            # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
                            @staticmethod
                            def display(a1,a2):
                                return a1 + a2
                        Foo.display(1,3)

    类方法

class Foo(object):
                        
                            # 类方法,cls是类
                            @classmethod
                            def show(cls,x1,x2):
                                print(cls,x1,x2)

                        # 执行类方法
                        Foo.show(1,8)

  3.属性(通过方法改造出来):

                    class Foo(object):
                        def __init__(self):
                            pass

                        @property
                        def start(self):
                            return 1

                        @property
                        def end(self):
                            return 10

                    obj = Foo()
                    print(obj.start)
                    print(obj.end)
总结:
  1.编写时:
    方法上方写@property
    方法参数:只有一个self
  2.调用时: 无需加括号 对象.方法
  3.应用场景:对于简单的方法,当无需传参且有返回值时,可以使用@property

嵌套:

  面向对象:

"""
                创建三个学校且三个学校的设施内容等都是一致.
                """

                class School(object):
                    def __init__(self, name, address):
                        self.name = name
                        self.address = address

                    def speech(self):
                        print('讲课')

                obj1 = School('老男孩北京校区', '美丽富饶的沙河')
                obj2 = School('老男孩上海校区', '浦东新区')
                obj3 = School('老男孩深圳校区', '南山区')
                class Teacher(object):
                    def __init__(self, name, age, salary):
                        self.name = name
                        self.age = age
                        self.__salary = salary
                        self.school = None

                t1 = Teacher('李杰', 19, 188888)
                t2 = Teacher('艳涛', 18, 60)
                t3 = Teacher('女神',16, 900000)
                # ############## 老师分配校区
                t1.school = obj1
                t2.school = obj1
                t3.school = obj2
                # ####################################
                # 查看t1老师,所在的校区名称/地址
                print(t1.school.name)
                print(t1.school.address)
                print(t1.name)
                print(t1.age)
                t1.school.speech()
准则:字段和方法的归类

 

posted @ 2018-11-26 20:15  7411  阅读(256)  评论(0编辑  收藏  举报