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()

 

posted @ 2019-10-25 14:45  fly_bk  阅读(156)  评论(0编辑  收藏  举报