zoukankan      html  css  js  c++  java
  • 面向对象 成员和嵌套

    成员和嵌套(建模)

    一、成员分为三类:

      1.实例变量(字段)

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

      2.类变量(静态字段)

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

    二、嵌套

    1.公有实例变量(字段):

    class Foo:
        def __init__(self,name):
            self.name=name
            self.age=123
        def func(self):
            print(self.name)
    ojb=Foo('jjj')
    print(ojb.name)
    print(ojb.age)
    ojb.func()
    
    
    jjj
    123
    jjj

     私有实例变量(字段):

    class Foo:
        def __init__(self,name):
            self.__name=name
            self.age=123
        def func(self):
            print(self.__name)
    obj=Foo("你是谁")
    print(obj.age)
    obj.func()
    注意:当他私有化的时候,print(obj.__name),会报错,拿不到__name的值,只能借助obj,func()从内部取到

     类变量(静态字段)的公有:

    class foo:
    country="中国"
    def __init__(self):
    pass
    def func(self):
    print(self.country)
    print(foo.country)#一般使用这个
    print(foo.country)#调用外部
    obj=foo()
    obj.func()#通过内部的func调用
     中国 中国 中国

      类变量(静态字段)的私有:

    class foo:
        __country="中国"
        def __init__(self):
            pass
        def func(self):
            # print(self.__country)
            print(foo.__country)#一般使用这个
    # print(foo.__country)#调用外部会报错,因为私有
    obj=foo()
    obj.func()#通过内部的func调用

     准则:实例变量(字段)访问时,使用对象访问:obj.name

       类变量(静态字段)访问时,使用类方法foo.country(实在不方便时才会使用self.country)

    知识点:什么时候要用变量呢?

    当所有对象中有共同的字段且都要修改或者删除的时候,可以将实例变量(字段)提取到类变量(静态字段)

    如何从继承中获取类变量私有中的内容呢?

    class Base:
        __secret ="受贿"
        def zt(self):
            print(Base.__secret)
    class foo(Base):
        def func(self):
            print(self.__secret)
            print(foo.__secret)
    obj=foo()
    obj.zt()
    #若果没有zt函数,是不会获取到父级里的__secret的,在继承中要有表现的话才会获取到

     静态方法使用:

    class foo(object):
        def __init__(self,name):
            self.name=name
        def func(self):
            print(self.name)
        @staticmethod#静态方法:如果方法无需使用对象中的值得话,就使用静态方法
        def display(a,b):
            return a+b
    obj=foo("lll")
    obj.func()
    print(obj.display(1,9))
    
    lll
    10

    静态方法的使用:

    1.编写:

    方法上面写@staticmethod

    方法的参数可有可无

    2.调用时:

    类名.方法名或者对象.方法名

    3.啥时候写静态方法:

    不调用对象中封装的值得时候

    类方法使用:

    class foo:
        def __init__(self,name):
            self.name=name
        def func(self):
            print(self.name)
        @staticmethod#静态方法
        def disliay(a,b):
            return a+b
        @classmethod#类方法
        def show(cls,c,d):
            print(cls,c,d)
    foo.show(1,9)
    
    <class '__main__.foo'> 1 9

     类方法的使用:

    1.定义时:

    方法上写@classmethod

    方法的参数:至少有一个cls参数

    2.执行的时候

    类名.方法名()#默认会将当前类传到参数里

    3.啥时候用?

    如果在方法中会用到当前类,那么就使用类方法

    私有的实例方法

    class fool:
        def __init__(self):
            pass
        def __display(self,xxx):
            print("siyou ",xxx)
        def func(self):
            self.__display(123)
    obj=fool()
    obj.func()
    
    siyou  123

    私有的静态方法

    class Foo(object):
        def __init__(self):
            pass
        @staticmethod
        def __display(arg):
            print('私有静态 方法',arg)
        def func(self):
            Foo.__display(123)
        @staticmethod
        def get_display():
            Foo.__display(888)
    # Foo.__display(123) 报错
    obj = Foo()
    obj.func()
    Foo.get_display()
    
    
    私有静态 方法 123
    私有静态 方法 888

     属性

    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
    10

     属性总结:

    编写的时候,方法上写@property,方法参数只有一个self。

    调用的时候无需加括号,对象.方法

    应用场景:对于简单的方法,无需传参且没有返回值的时候,可以使用@property

     练习题:翻页

    2

    普通版:
    date_lst=[] for i in range(1,901): date_lst.append("alex_%s页" %i ) while 1: page=int(input("请输入你要查看的页码")) per_page_num=10 start=(page-1)*per_page_num end=page*per_page_num page_list=date_lst[start:end] for el in page_list: print(el) 面向对象版:
    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):
    """
    计算索引的结束位置
    :return:
    """
    return self.page * self.per_page_num

    def show(self):
    result = self.data_list[self.start:self.end]
    for row in result:
    print(row)


    data_list = []

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

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

     嵌套:

    """
    创建三个学校且三个学校的设施内容等都是一致.
    """
    
    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('TT', 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()
  • 相关阅读:
    ES6笔记分享 part 2
    ES6笔记分享 part 1
    JS事件之自建函数bind()与兼容性问题解决
    JavaScript DOM事件对象的两个小练习 | 学习内容分享
    JavaScript数组的方法 | 学习笔记分享
    JavaScript构造函数 | 学习笔记分享
    Hexo+Github个人博客搭建 | 实战经验分享
    Hello world!
    “1+X”证书Web前端开发等级考试简介
    1+x证书Web 前端开发初级——理论考试(试卷1)
  • 原文地址:https://www.cnblogs.com/wqzn/p/9550214.html
Copyright © 2011-2022 走看看