继续面向对象之成员与组合

成员:(3类)

1.变量:    实例变量与类变量

实例变量:包含公有实例变量(字段)和私有实例变量(字段)  区别在于"__"

类变量:也包含公有类变量和私有类变量(静态字段) 区别也在于__

总结:  A准则:实例变量(字段)访问时,直接使用对象访问,即:obj.name

      类变量(静态字段)访问时,使用类方法,即:Foo.country(实在不方便时,才使用对象方法                      (ob j.country))
          B易错点:a 创建对象时,传入的参数和原对象中的参数不在同一空间    

  
class Foo:
    country='china'
    def __init__(self,name):
        self.name=name
    def func(self):
        ...
obj=Foo('america')
obj1=Foo('美国')
print(obj.name)  #结果为america
print(obj1.name)# 结果为 美国
View Code

  B易错点:b 在外部更改(obj.country='中华人民共和国')相当于给局部空间中添加了一个obj.country='中华人民共和国'变量 对类变量没有影响

class Foo:
    country='china'
    def __init__(self,name):
        self.name=name
    def func(self):
        ...
obj=Foo('america')
obj1=Foo('美国')
print(Foo.country)  #结果为 china
print(obj.country)  #结果为 china
print(obj1.country)# 结果为 china
obj.country='中华人民共和国'
print(obj.country)  #结果为 中华人民共和国
print(obj1.country) # 结果为 china
View Code

总结 :1外部无法调用私有类变量,如果想在外部调用显示内部私有变量,可通过熟人(即内部方法)得到(不推荐)2 儿子都不知道的事:即私有变量可在内部被函数类方法调用,但是如果存在父子类对象 在派生类中是无法调用基类中的私有变量的.

2方法 : 实例方法 静态方法 类方法 

实例方法:  私有实例方法:在外部无法访问

class Foo:

    def __init__(self,name):

        self.name=name

    #实例方法(存在的必要性调用self中内容)

    def func(self):

            print(self.name)
    #静态方法,如果方法无法使用对象中封装的值,就可使用静态方法
    @staticmethod
    def display(a1,a2):
        return a1+a2
obj=Foo('金角大王')
obj.func() #结果为金角大王
obj1 = Foo.display(3,1)

print(obj1)  #结果为4
View Code

静态方法:  私有静态方法:在外部调用时会报错

     1编写时,上方写@staticmethod  参数可有可无

     2 调用时,   **推荐使用  类.方法名(参数(可有可无))   *不推荐  对象.方法名()

      3静态方法存在必要:无需调用对象中封装的值.

类方法:  1 定义时, 上方写@classmethod,至少有一个cls参数

    2执行时, 类名.方法名()  默认会将当前类传到参数中

    3何时使用?如果方法中或使用到当前类,就可以使用类方法

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

    # 实例方法,self是对象
    def func(self):
        print(self.name)

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

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

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

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

  1编写时 上方写@property  只有一个self参数

  2调用时:无需加括号 直接  对象.方法 调用

  3应用场景:对于简单的方法,当无需传值且有返回值时

示例:

class Foo(object):
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)            

练习题:

翻页问题

# 以前写法
# data_list = []
#
# for i in range(1, 901):
#     data_list.append('alex-%s' % i)
#
# while True:
#     # 1. 要查看的页面
#     page = int(input('请输入要查看的页码:'))
#
#     # 2. 每页显示 10 条
#     per_page_num = 10
#
#     start = (page-1) * per_page_num
#     end = page * per_page_num
#
#     page_data_list = data_list[start:end]
#     for item in page_data_list:
#         print(item)


class Pagenation(object):
    """
    处理分页相关的代码
    """

    def __init__(self,page,per_page_num=10):
        """
        初始化
        :param page: 当前要查看的页面
        :param per_page_num: 每页默认要显示的数据行数
        """
        self.page = page
        self.per_page_num = per_page_num

    @property
    def start(self):
        """
        计算索引的起始位置
        :return:
        """
        return (self.page-1) * self.per_page_num

    @property
    def end(self):
        """
        计算索引的结束位置
        :return:
        """
        return self.page * self.per_page_num



data_list = []

for i in range(1, 901):
    data_list.append('alex-%s' % i)

while True:
    # 1. 要查看的页面
    page = int(input('请输入要查看的页码:'))

    obj = Pagenation(page)
    page_data_list = data_list[obj.start:obj.end]
    for item in page_data_list:
        print(item)
制作翻页
class Pagenation(object):
    """
    处理分页相关的代码
    """

    def __init__(self,data_list,page,per_page_num=10):
        """
        初始化
        :param data_list: 所有的数据
        :param page: 当前要查看的页面
        :param per_page_num: 每页默认要显示的数据行数
        """
        self.data_list = data_list
        self.page = page
        self.per_page_num = per_page_num

    @property
    def start(self):
        """
        计算索引的起始位置
        :return:
        """
        return (self.page-1) * self.per_page_num

    @property
    def end(self):
        """
翻页制作优化版

附送:嵌套了解

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

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()
嵌套练习

猜你喜欢

转载自www.cnblogs.com/lingcai/p/9549720.html
今日推荐