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("肠")
—