• day20


    回顾

    类的三大特性

    封装、继承、多态

    1.类成员

    类变量

    绑定方法

    类方法

    静态方法

    属性

    实例(对象)

    实例变量

    1.1 实例变量

    1.2 类变量

    1.2.1 定义

    写在类的下一级,与方法同一级。

    1.2.2 访问

    类.类变量名称
    对象.类变量名称

    1.2.3 面试题

    class Base:
       x = 1
       
    obj = Base()


    print(obj.x) # 先去对象中找,没有再去类中找。
    obj.y = 123  # 在对象中添加了一个y=123的变量。
    print(obj.y) # 123
    obj.x = 123
    print(obj.x)  # 123
    print(Base.x) # 1
    class Parent:
       x = 1
       
    class Child1(Parent):
       pass

    class Child2(Parent):
       pass

    print(Parent.x,Child1.x,Child2.x) # 1 1 1
    Child1.x = 2
    print(Parent.x,Child1.x,Child2.x) # 1 2 1
    Child2.x = 3
    print(Parent.x,Child1.x,Child2.x) # 1 2 3

    1.2.4 总结

    总结:找变量优先找自己,自己没有找 类 或 基类;修改或赋值只能在自己的内部设置。

    1.3 方法(绑定方法/普通方法)

    1.3.1 定义

    至少有一个self参数

    1.3.2 执行

    先创建对象,再由对象.方法()

    class Foo:
       def func(self,a,b):
           print(a,b)
           
    obj = Foo()
    obj.func(1,2)   # 浪费资源 此处并未调用self
    # ###########################
    class Foo:
       def __init__(self):
           self.name = 123

       def func(self, a, b):
           print(self.name, a, b)

    obj = Foo()
    obj.func(1, 2) # 123 1 2

    1.4 静态方法

    1.4.1 定义

    @staticmethod装饰器

    参数无限制

    1.4.2 执行

    类.静态方法名()

    对象.静态方法名()

    class Foo:
       def __init__(self):
           self.name = 123

       def func(self, a, b):
           print(self.name, a, b)

       @staticmethod
       def f1():
           print(123)

    obj = Foo()
    obj.func(1, 2) # 123 1 2

    Foo.f1() # 123
    obj.f1() # 123 不推荐

    1.5 类方法

    1.5.1 定义

    @classmethod装饰器

    至少有cls参数,当前类

    1.5.2 执行

    类.类方法()

    对象.类方法()

    class Foo:
       def __init__(self):
           self.name = 123

       def func(self, a, b):
           print(self.name, a, b)

       @staticmethod
       def f1():
           print(123)

       @classmethod
       def f2(cls,a,b):
           print('cls是当前类',cls)
           print(a,b)

    obj = Foo()
    obj.func(1, 2) # 123 1 2

    Foo.f1() # 123
    Foo.f2(1,2) # Foo 1 2

    1.5.3 面试题

    # 问题: @classmethod和@staticmethod的区别?
    """
    一个是类方法一个静态方法。
    定义:
    类方法:用@classmethod做装饰器且至少有一个cls参数。
    静态方法:用staticmethod做装饰器且参数无限制。
    调用:
    类.方法直接调用。
    对象.方法也可以调用。
    """

    1.6 属性

    1.6.1 定义

    @property装饰器

    只有一个self参数

    1.6.2 执行

    对象.方法 无需添加括号

    class Foo:

       @property
       def func(self):
           print(123)
           return 666

    obj = Foo()
    result = obj.func # 123
    print(result) # 666
    # 属性的应用

    class Page:
       def __init__(self, total_count, current_page, per_page_count=10):
           self.total_count = total_count
           self.per_page_count = per_page_count
           self.current_page = current_page
       @property
       def start_index(self):
           return (self.current_page - 1) * self.per_page_count
       @property
       def end_index(self):
           return self.current_page * self.per_page_count


    USER_LIST = []
    for i in range(321):
       USER_LIST.append('alex-%s' % (i,))

    # 请实现分页展示:
    current_page = int(input('请输入要查看的页码:'))
    p = Page(321, current_page)
    data_list = USER_LIST[p.start_index:p.end_index]
    for item in data_list:
       print(item)

    2.成员修饰符

    1.公有 所有地方都能访问到

    2.私有 只有自己可以访问到

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

       def func(self):
           print(self.__name)


    obj = Foo('alex')
    # print(obj.__name) # 报错 无法获取
    obj.func() # 可以通过类内部另外的方法调取
    class Foo:
       __x = 1

       @staticmethod
       def func():
           print(Foo.__x)


    # print(Foo.__x) # 报错 无法获取
    Foo.func() # 可以通过类内部另外的方法调取
    class Foo:

       def __fun(self):
           print('msg')

       def show(self):
           self.__fun()

    obj = Foo()
    # obj.__fun() # 报错 无法获取
    obj.show() # 可以通过类内部另外的方法调取

    3.强制访问私有成员

    # 强制访问私有成员

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


    obj = Foo('alex')

    print(obj._Foo__x) # 强制访问私有实例变量

    3.补充 类的嵌套

    class Foo:
       def __init__(self,num):
           self.num = num
           
           
    cls_list = []
    for i in range(10):
       cls_list.append(Foo) # [Foo,Foo,Foo,Foo,Foo,Foo,Foo,Foo,Foo,Foo]
       
    for i in range(len(cls_list)):
       obj = cls_list[i](i) # [Foo(0),Foo(1),Foo(2),Foo(3),Foo(4),Foo(5),Foo(6),Foo(7),Foo(8),Foo(9)]
       print(obj.num) # 0 1 2 3 4 5 6 7 8 9
    class Foo:
       def __init__(self,num):
           self.num = num
           
    B = Foo # 别名
    obj = B('alex')  # alex
    class Foo:
    def f1(self):
           print('f1')
       
       def f2(self):
           print('f2')

    obj = Foo()

    v = [ obj.f1,obj.f2 ]
    for item in v:
       item() # f1 f2
    class Foo:
       def f1(self):
           print('f1')
       
       def f2(self):
           print('f2')
           
    def f3(self):
           v = [self.f1 , self.f2 ]
           for item in v:
               item()
               
    obj = Foo()
    obj.f3() # f1 f2
    class Account:
       
       def login(self):
           pass
       
       def register(self):
           pass
       
       def run(self):
           info = {'1':self.register, '2':self.login }
           choice = input('请选择:')
           method = info.get(choice)
           method()
    class Foo:
       pass

    class Foo(object):
       pass

    # 在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。


    # 如果在python2中这样定义,则称其为:经典类
    class Foo:
       pass
    # 如果在python2中这样定义,则称其为:新式类
    class Foo(object):
       pass

    class Base(object):
       pass
    class Bar(Base):
       pass
    class School(object):
       def __init__(self,title,addr):
           self.title = title
           self.address = addr
           
    class ClassRoom(object):
       
       def __init__(self,name,school_object):
           self.name = name
           self.school = school_object
           
    s1 = School('北京','沙河')
    s2 = School('上海','浦东')
    s3 = School('深圳','南山')

    c1 = ClassRoom('全栈21期',s1)
    c1.name
    c1.school.title
    c1.school.address
    # ############################################
    v = [11,22,33,{'name':'山海','addr':'浦东'}]

    v[0]
    v[3]['name']
  • 相关阅读:
    HDU 4221 Greedy?(贪心)
    HDU 3400 Line belt (三分法)
    POJ 1026 Cipher(置换)
    POJ 1166 The Clocks(暴搜)
    HDU 4122 Alice's mooncake shop(RMQ,或者单调队列)
    POJ 1721 CARDS(置换)
    POJ 3270 Cow Sorting(置换)
    高斯消元法(模板)
    http://blog.seirsoft.com
    转载 STL容器的erase用法
  • 原文地址:https://www.cnblogs.com/usherwang/p/12916557.html
Copyright © 2020-2023  润新知