面向对象之类的成员,嵌套

发布时间:2019-03-05 12:11:25编辑:auto阅读(1820)

    类的成员可分为三大类:字段丶方法和属性

    一丶字段

      字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同.

      普通字段属于对象

      静态字段属于类

    class Foo:
        #类变量(静态字段)
        country = "你好"
    
        def __init__(self,name):
            # 实例变量(普通字段)
            self.name = name
        def too(self):
            print("===========")
    
    #直接访问普通字段
    obj = Foo("李白")
    obj.too()
    #直接访问静态字段
    print(Foo.country)

     

      由上述代码可以看出[普通字段需要通过对象来访问] [静态字段通过类访问],在使用上可以看出普通字段和静态字段的归属是不同的,其在内容的存储方式也不一样,静态字段在内存中只保存一份,普通字段在每个对象中都要保存一份

      上面我们看到的两种字段都是公有字段,下面为私有字段

    class Foo:
        #类变量(静态字段)
        country = "你好"
        #私有类变量(静态字段)
        __ctorens = "再见"
    
        def __init__(self,name,phone):
            # 实例变量(普通字段)
            self.name = name
            #私有示例变量(普通字段)
            self.__phone = phone
        def too(self):
            print(Foo.__ctorens)
    
    #直接访问普通字段
    obj = Foo("李白","165136851546")
    obj.too()
    #直接访问静态字段
    print(Foo.country)
    #在类外面是没法访问类中的私有字段的,所以这里会报错
    print(Foo.ctorens)

     

     二丶方法

      方法包括普通方法丶静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

       1.普通方法:由对象调用,至少一个self参数,执行普通方法时,自动将调用该方法的对象赋值给self

       2.类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls

       3.静态方法:由类调用,无默认参数

    # 实例方法
    class Foo:
        def __init__(self,name):
            self.name = name
        #实例方法
        def tom(self):
            pass
    obj = Foo("XX")
    obj.tom()
    
    #静态方法
    #在方法前面加@staticmethod,方法名中的self也不用写了,可以写任何参数,调用直接用  类名.方法名(参数) 调用
    class Foo:
        def __init__(self,name):
            self.name = name
        #静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
        @staticmethod
        def tom(a,b):
            print(a,b)
    Foo.tom(1,2)
    
    # 类方法
    #在方法前面加上@classmethod,方法名中参数必须有cls,cls是指类
    class Foo:
        def __init__(self,name):
            self.name = name
    
        def show1(self):
            print(self)
        # 类方法
        @classmethod
        def show(cls,a,b):
            print(cls,a,b)  #<class '__main__.Foo'> 1 2
    Foo.show(1,2)

      方法跟字段一样,也分为私有跟公有,私有就是在方法名前面加上__,调用是不能在类外面直接调用,需要调用类中的一个公有方法,再在公有方法里调用私有方法

    class Foo:
        def __init__(self,name):
            self.name = name
    
        def show1(self):
            Foo.__show(1,2)
        # 私有类方法
        @classmethod
        def __show(cls,a,b):
            print(cls,a,b)  #<class '__main__.Foo'> 1 2
    
    obj = Foo("XX")
    obj.show1()

     

     

    三丶属性

      属性的定义时就是在普通方法的基础上添加@property装饰器,属性仅有一个self参数,调用时无需括号

     

    class Foo(object):
        def __init__(self):
            pass
        #属性在方法名前面加上@property
        @property  
        def start(self):
            return 1
    
    obj = Foo()
    print(obj.start)    #无需加括号,直接调用

     

     

     四丶面向对象的嵌套

      两个类中的变量互相建立关系就叫嵌套

    class School:
        def __init__(self,name):
            self.name = name
    obj = School("舞蹈教室")
    obj1 = School("音乐教室")
    obj2 = School("美术教室")
    
    
    class Teacher:
        def __init__(self,name):
            self.name = name
    t = Teacher("舞蹈老师")
    t1 = Teacher("音乐老师")
    t2 = Teacher("美术老师")
    
    #############为老师分配教室
    t.School = obj
    t1.School = obj1
    t2.School = obj2
    ############查看t1老师所在的教室
    print(t1.School.name)

     

关键字