zoukankan      html  css  js  c++  java
  • 面向对象【类的成员】

    一、类的成员

    1、变量

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

    • 普通字段属于实例变量

        - 公有实例变量(字段) 
        - 私有实例变量(字段) 

    • 静态字段属于类变量

        - 公有类变量(静态字段)
        - 私有类变量(静态字段)

    class Province:
    
        # 静态字段
        country = '中国'
    
        def __init__(self, name):
    
            # 普通字段
            self.name = name
    
    
    # 直接访问普通字段
    obj = Province('河北省')
    print obj.name
    
    # 直接访问静态字段
    Province.country
    变量的定义和使用

    2、方法

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

    • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
    • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
    • 静态方法:由调用;无默认参数;
    class Foo:
    
        def __init__(self, name):
            self.name = name
    
        def ord_func(self):
            """ 定义普通方法,至少有一个self参数 """
    
            # print self.name
            print '普通方法'
    
        @classmethod
        def class_func(cls):
            """ 定义类方法,至少有一个cls参数 """
    
            print '类方法'
    
        @staticmethod
        def static_func():
            """ 定义静态方法 ,无默认参数"""
    
            print '静态方法'
    
    
    # 调用普通方法
    f = Foo()
    f.ord_func()
    
    # 调用类方法
    Foo.class_func()
    
    # 调用静态方法
    Foo.static_func()
    方法的定义和使用

    面试题: 静态方法/类方法和实例方法的区别?

     答案:调用方法时自动传入的参数不同

    3、属性

    由属性的定义和调用要注意一下几点:

    • 定义时,在普通方法的基础上添加 @property 装饰器;
    • 定义时,属性仅有一个self参数
    • 调用时,无需括号
                 方法:foo_obj.func()
                 属性:foo_obj.prop

    注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象

            属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。

    class Foo:
    
        def func(self):
            pass
    
        # 定义属性
        @property
        def prop(self):
            pass
    
    foo_obj = Foo()
    
    foo_obj.func()
    foo_obj.prop   #调用属性
    属性的定义和使用

    二、嵌套

    """
    创建三个学校且三个学校的设施内容等都是一致.
    """
    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()
    
    准则: 字段和方法的归类.
    主动调用其他类的成员
    #方式一:
    class Base(object):
    
        def f1(self):
            print('5个功能')
            
    class Foo(object):
        def f1(self):
            print('3个功能')
            Base.f1(self)
    
    obj = Foo()
    obj.f1()
    
    总结:
    Base.实例方法(自己传self)
    与继承无关
    # 方式二:按照类的继承顺序,找下一个【super】.
    class Foo(object):
        def f1(self):
            super().f1()
            print('3个功能')
    
    class Bar(object):
        def f1(self):
            print('6个功能')
    
    class Info(Foo,Bar):
        pass
    
    # obj = Foo()
    # obj.f1()
    
    obj = Info()
    obj.f1()
  • 相关阅读:
    好玩的spring boot banner 图
    数据结构和算法二(数组)
    数据结构与算法三(链表)
    数据结构和算法一(基础知识)
    jenkins 部署node应用
    Docker-compose 安装Jenkins
    Docker 网络模式
    exe4j 转jar
    c#索引器的简单用法
    Adapter模式
  • 原文地址:https://www.cnblogs.com/shanae/p/9549898.html
Copyright © 2011-2022 走看看