面向对象【类的成员】

一、类的成员

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()
原文地址:https://www.cnblogs.com/shanae/p/9549898.html