Python之面向对象2

在这里插入图片描述

1、私有属性及方法


在这里插入图片描述

# class People:
#     def __init__(self, name, age):
#         self.name = name
#         # self.age = age
#         self.__age = age
#
#     def print_info(self):
#         print(self.__age)
#
#     def get_age(self):
#         return self.__age
#
#     def set_age(self, new_age):
#         self.__age = new_age
#         print(f"new age:{self.__age}")
#
#
# zs = People("zs", 19)
# print(zs.name)
# # print(zs.age)       # 在类的外部访问私有属性报错:AttributeError: 'People' object has no attribute 'age'
#
#
# # 如何才能在类的外部访问私有属性?
# # zs.print_info()       # 1.私有属性在类的内部的方法当中是可以访问的
# # print(zs.get_age())   # 2.在类的内部将私有属性返回出来,进行访问
# zs.set_age(50)          # 3.在类的外部对私有属性进行修改


class Demo:
    def test1(self):
        print("--1--")

    def __test2(self):
        print("--2--")

    # def test3(self):
    #     return self.__test2()


d = Demo()
d.test1()
# d.__test2()   # 私有方法没有办法直接在类的外部进行访问,报错:AttributeError: 'Demo' object has no attribute '__test2'

# d.test3()       # 通过类的内部的方法去进行调用

# d._Demo__test2()  # 注意:可以直接通过 对象._类名__私有方法名() 去访问私有方法,但是不建议使用

2、属性


# class Province:
#     def __init__(self, name):
#         # 实例属性 self.属性名
#         self.country = "中国"
#         self.name = name
#
#     def print_info(self):
#         print(self.country, self.name)  # self就是对象本身 访问
#         # print(clara.country, clara.name)  # 通过每个对象 访问 可以 但是不建议使用
#         # print(Province.country, Province.name)  # 报错
#
#
# clara = Province("湖南")
# jx = Province("广州")
# clara.print_info()
# jx.print_info()


class Province:
    country = "中国"  # 类属性(静态属性)

    def __init__(self, name):
        # 实例属性 self.属性名
        self.name = name

    def print_info(self):
        # print(self.country, self.name)  # self就是对象本身 访问 类属性
        # print(clara.country, clara.name)  # 通过每个对象 访问 可以 但是不建议使用
        print(Province.country)  # 类属性,是可以直接通过类名来访问的


clara = Province("湖南")
jx = Province("广州")
clara.print_info()
jx.print_info()

3、方法


在这里插入图片描述
在这里插入图片描述

# class Demo:
#     def __init__(self):
#         self.name = "hlll"
#
#     # 实例方法:通常用于需要使用实例属性
#     def test_one(self):
#         # print(self)
#         print(self.name)
#
#     @classmethod
#     def cls_md(cls, age):    # 自建参数不再是self,而是cls,代指当前类
#         print(cls)      # <class '__main__.Demo'>
#         print(age)
#
#     @staticmethod
#     def stat_md():
#         print("我是静态方法")
#
#
# d = Demo()
# d.test_one()
# d.cls_md("89")
# d.stat_md()


# import time
#
#
# # 获取当前的时间
# def show_time():
#     # print(time.localtime())   # 返回当前时间,元组
#
#     # 进行时间格式化
#     print(time.strftime("%Y:%m:%d", time.localtime()))
#
#
# show_time()


# import time
#
#
# class TimeTest:
#
#     @staticmethod
#     def show_time():
#
#         # print(time.localtime())   # 返回当前时间,元组
#
#         # 进行时间格式化
#         print(time.strftime("%Y:%m:%d", time.localtime()))
#
#
# t = TimeTest()
# t.show_time()

4、封装


在这里插入图片描述

class Student:
    addr = "123"

    def __init__(self, name, age):
        self.name = name    # 将属性封装到类的内部
        self.age = age

    def print_info(self):
        print(self.name, self.age)
        
        # print(self.addr)
        # self.addr = "222"
        # print(self.addr)    # 不能通过实例去修改类属性的
        # print(Student.addr)


# 在同一个类创建多个对象之间,属性是互不干扰的
xn = Student("寻你", 19)
jx = Student("九夏", 29)
xn.print_info()
jx.print_info()

5、新式类与经典类


在这里插入图片描述
在这里插入图片描述

# 但是注意,在python3当中,默认都是新式类
class Demo:     # 在python2中,经典类
    pass


class Demo2(object):    # 继承了object,在python2中,新式类
    pass


d1 = Demo()
d2 = Demo2()
# print(len(d1.__dir__()))    # 26
# print(len(d2.__dir__()))    # 26

6、继承


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class GrandFather(object):
    def sleep(self):
        print("GrandFather sleep 10")


class Father(GrandFather):
    def eat(self):
        print("Father eat")

    def drink(self):
        print("Father drink")


class Son(Father):
    def study_python(self):
        print("Son study python")

    def sleep(self):
        print("Son sleep 8")   # 当子类有与父类名字相同的方法时,就意味着是重写了父类的方法!
        # 在执行自己的方法的时候 仍然继承父类的方法
        # super(Son, self).sleep()  # Son的对象去调用父类的sleep方法
        # super().sleep()     # 参数不传也可以

        GrandFather.sleep(self) # 通过 类名.方法名(self)


s = Son()
# s.study_python()

s.eat()     # 通过子类的对象可以使用父类的方法  子类没有 则去父类找

s.sleep()   # 子类没有 则去父类找 父类没有 则继续去父类的父类找...

# s.play()


"""
1.单继承:深度优先
2.重写:
    防止执行父类当中的方法
3.self永远指的是执行该方法的调用者
4.super(当前类,self).父类中的方法(arg)
"""

7、继承注意点


在这里插入图片描述
在这里插入图片描述

"""
__init__方法是否会被继承?也会继承,并且同实例方法一致。深度优先
"""


# class Father(object):
#     def __init__(self):
#         print("Father")
#
#
# class Son(Father):
#     # def __init__(self):
#     #     print("Son")
#     pass
#
#
# s = Son()


"""
私有属性与私有方法是否被继承?
"""
class Father(object):
    def __init__(self):
        self.name = "amy"
        self.__age = 18

    def test(self):
        print("test")

    def __test2(self):
        print("__test2")


class Son(Father):
    def get_test(self):
        # print(self.name)
        # self.test()

        # 注意:私有属性不会被继承
        # print(self.__age)

        # 注意:私有方法也不会被继承
        self.__test2()


s = Son()
# print(s.name)
# print(s.__age)

s.get_test()

作业

题1

在这里插入图片描述

import random


class GuessNum(object):
    def __init__(self):
        self.__rand_num = random.randint(1, 10)
        print(f"random_number:{self.__rand_num}")

    def guess_it(self):
        ipt_num = int(input("请输入1-10的数"))

        while True:
            if self.__rand_num == ipt_num:
                print("猜对了!")
                break
            else:
                ipt_num = int(input("猜的不对奥,请重新输入!"))


b = GuessNum()
b.guess_it()

题2

在这里插入图片描述

class PanCake(object):
    def __init__(self):
        self.cake_status = "生的"
        self.cake_level = 0
        self.condiments = []

    def __str__(self):
        return f"煎饼的状态:{self.cake_status},煎的时长:{self.cake_level},添加的作料:{self.condiments}"

    def cook(self, cooked_time):
        self.cake_level += cooked_time
        if self.cake_level >= 0 and self.cake_level < 3:
            self.cake_status = "生的"
        elif self.cake_level >= 3 and self.cake_level < 5:
            self.cake_status = "半生不熟"
        elif self.cake_level >= 5 and self.cake_level < 8:
            self.cake_status = "全熟"
        elif self.cake_level >= 8:
            self.cake_status = "焦了"

    def add_condiments(self, food):
        self.condiments.append(food)


pc = PanCake()
pc.cook(1)
pc.cook(1)
# pc.cook(1)
# pc.cook(3)
pc.add_condiments("肠")

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值