zoukankan      html  css  js  c++  java
  • 08.面向对象程序设计

    类的创建:

    class Class1:
        """类的帮助信息"""
        pass  # 没有具体功能实现
    
    
    c = Class1() # 创建Class1类的实例
    print(c)  # <__main__.Class1 object at 0x10ed722b0>

    类的构造方法:

    class Class1:
        """类的帮助信息"""
    
        def __init__(self):  # 构造方法
            print("我是Class1类")
    
    
    c = Class1()  # 创建Class1类的实例

    自定义构造参数:

    class People:
        """People类"""
    
        # 自定义参数
        def __init__(self, name, age):  # 构造方法
            print("我叫%s,今年%d岁了" % (name, age))
    
    
    p = People('sam', 12)  # 我叫sam,今年12岁了

    类的成员:

    类属性
    实例属性
    实例方法
    class People:
        """People类"""
        name = '匿名'  # 类属性,可以通过实例名或类名访问
        age = 0
    
        # 自定义参数
        def __init__(self, name='', age=0):  # 构造方法
            People.name = name if name else People.name
            People.age = age if age else People.age
            print("我叫%s,今年%d岁了" % (People.name, People.age))
    
        # self: 表示类的实例
        def do(self, ing):  # 实例方法
            print(ing)
    
    
    p = People()  # 我叫匿名,今年0岁了
    p.do("写字")
    print(People.age)  # 0
    p2 = People('tom', 12)  # 我叫tom,今年12岁了
    print(People.age)  # 12
    # 添加类属性
    People.other = 'other'
    print(People.other)  # other
    p.other = 'p_other'
    print(p.other)  # p_other
    
    
    class class2():
        def __init__(self):
            self.a = 1111  # 实例属性,只能通过实例名访问
    
    
    c2 = class2()
    print(c2.a)  # 1111
    # 通过类名访问实例属性报错
    # class2.a  # AttributeError: type object 'class2' has no attribute 'a'

    访问限制:

    # 以单下划线开头的表示protect(保护)类型的成员,只允许类本身和子类进行访问,但不能使用
    # from module import * 语句导入
    class C1:
        _a = '保护属性'  # 定义保护属性
    
        def __init__(self):
            print(C1._a)  # 在实例方法中访问保护属性
    
    
    c = C1()
    print(c._a)  # 通过实例名访问保护属性
    print(C1._a)  # 通过类名访问保护属性
    
    
    class C2:
        __aa = '私有属性'  # 定义私有属性
    
        def __init__(self):
            print(C2.__aa)  # 在实例方法中访问私有属性
    
    
    c2 = C2()
    # 通过实例名访问私有属性
    # print(c2.__aa)  #AttributeError: 'C2' object has no attribute '__aa'
    # 通过类名访问私有属性
    # print(C2.__aa)  #AttributeError: type object 'C2' has no attribute '__aa'
    print(c2._C2__aa)  # 私有属性可以通过'实例名._类名__xx'方式访问
    print(C2._C2__aa)  # 私有属性可以通过'类名._类名__xx'方式访问

    @property:

    class C1:
        def __init__(self, w, h):
            self.w = w
            self.h = h
    
        @property  # 将方法转换为属性
        def area(self):
            return self.w * self.h
    
    
    c = C1(12, 12)
    print(c.area)  # 144

    为属性添加安全保护:

    class C1:
        def __init__(self, w, h):
            self.__res = w * h
    
        @property  # 将方法转换为属性
        def area(self):
            return self.__res  # 返回私有属性
    
    
    c = C1(12, 12)
    print(c.area)  # 144
    # 修改只读属性保存
    # c.area = 12  # AttributeError: can't set attribute

    属性的setter方法:

    class C1:
        list_s = ['a', 'b', 'c']
    
        def __init__(self, s):
            self.__res = s
    
        @property  # 将方法转换为属性
        def area(self):
            return self.__res  # 返回私有属性
    
        @area.setter  # 设置setter方法,让属性可修改
        def area(self, value):
            if value in C1.list_s:
                self.__res = '你选择了' + value
            else:
                self.__res = '你的选择不存在'
    
    
    c = C1('1')
    c.area = 'a'
    print(c.area)  # 你选择了a
    c.area = 'e'
    print(c.area)  # 你的选择不存在

    继承、方法重写:

    class Fruit:
        color = '绿色'
    
        def harvest(self, c):
            print(c)
            print("原来的颜色" + Fruit.color)
    
    
    class Apple(Fruit):
        color = '红色'
    
        def __init__(self):
            print('apple')
    
        def harvest(self, c):  # 方法重写
            print(c)
            print(Apple.color)
    
    
    class Orange(Fruit):
        color = '橙色'
    
        def __init__(self):
            print('orange')
    
    
    apple = Apple()
    apple.harvest(apple.color)
    orange = Orange()
    orange.harvest(orange.color)
    # apple
    # 红色
    # 红色
    # orange
    # 橙色
    # 原来的颜色绿色

    派生类中调用基类的方法:

    class Fruit:
        def __init__(self, c):
            Fruit.color = c
    
        def harvest(self):
            print("原来的颜色" + Fruit.color)
    
    
    class Apple(Fruit):
        def __init__(self):
            print('apple')
    
    
    class Apple2(Fruit):
        def __init__(self, c):
            # Fruit.__init__(self,c) # 直接使用基类名调用__init__()方法
            # super(Apple2,self).__init__(c)  # 使用super写法一
            super().__init__(c) # 调用基类的__init__()方法
            print('apple')
    
    
    # a = Apple()
    # a.harvest()  # AttributeError: type object 'Fruit' has no attribute 'color'
    a2 = Apple2('red')
    a2.harvest()
  • 相关阅读:
    2015第46周六
    2015年第46周五
    2015第46周四
    2015第46周三
    自己写shell命令pwd
    IOS成长之路-Nsstring搜索方法rangeOfString
    【Nginx】epoll事件驱动模块
    深入了解回调函数Java
    VS2008下直接安装Boost库1.46.1版本号
    oracle在schema是什么意思?
  • 原文地址:https://www.cnblogs.com/fly-book/p/11737953.html
Copyright © 2011-2022 走看看