HSP_10章 Python面向对象编程oop_基础部分

在这里插入图片描述

P107 类与实例的关系

1.类与实例的关系示意图

09032888ee854d68a1b3f44dc76627c3.png)
在这里插入图片描述

2.类与实例的代码分析

#定义一个猫类。age:name:color是属性,或者称为成员变量
# Cat类就是你自己定义的一个新类型

# 定义Cat类
class Cat:
# age:name:color是展性
    age = None# 年龄属性
    name = None#名字属性
    color = None# 颜色展性
# 通过Cat类,创建实例(实例对象/对象)
cat1 = Cat()

# 通过对象名.属性名 可以各个属性赋值
cat1.name = "小白"
cat1.age = 2
cat1.color = "白色"


print(f"cat1的信息为 name: {cat1.name} age:{cat1.age} color:{cat1.color}")

# 小结: 通过以上案例可以更好管理小猫的属性

P109 对象形式和传参机制

1. 类与对象的区别和联系

在这里插入图片描述

2. 属性/成员变量

在这里插入图片描述

# @Version  : 1.0
# @Autuor   : Zoran

#定义Cat类
class Cat:
    age=2 #年龄属性
    name ="小白"#名字属性
    color ="白色"# 颜色属性
#创建对象
cat1 = Cat()

print(f"age: {cat1.age} name:{cat1.name} color: {cat1.color}")


cat2 = Cat()

cat2.age = 1  # 年龄属性
cat2.name = "小黑"  # 名字属性
cat2.color = "黄色"  # 颜色属性

print(f"age: {cat2.age} name:{cat2.name} color: {cat2.color}")

3. 类的定义和使用

  • 如何定义类
    在这里插入图片描述
  • 如何创建对象
    在这里插入图片描述
  • 如何访问属性
    在这里插入图片描述

4. 对象的传递机制

在这里插入图片描述

# 定义Person类
class Person:
    age = None  # 年龄属性
    name = None  # 名字属性


p1 = Person()
p1.age = 10
p1.name="小明"
p2 = p1 #把p1赋给了p2,即:让p2指向p1
print(p2.age) #把p1赋给了p2,即:让p2指向p1

print(f"p1.name地址: {id(p1.age)} p2.name地址::{id(p2.age)} ")

  • 练习题

在这里插入图片描述

class Person:
    age = None  # 年龄属性
    name = None  # 名字属性
    
a = Person()
a.age = 10
a.name = "jack"
b = a
print(b.name)  # ? "jack"

b.age = 200
b = None
print(a.age)  # ? 200
print(b.age)  # ? Error 

P110 对象的布尔值

  • Python一切皆为对象,所有对象都有一个布尔值,通过内置函数bool()可以获取对象的布尔值
  • 下面对象的布尔值为False
  1. False
  2. 数值0
  3. None
  4. 空字符串
  5. 空列表
  6. 空字典
  7. 空元组
  8. 空集合
print("---下面对象的布尔值为False---")
print(bool(False))
print(bool(0))
print(bool(""))
print(bool([])) # 空列表
print(bool(()))  # 空元组
print(bool({}))  # 空字典
print(bool(set()))  # 空集合

# 因为所有对象都有一个布尔值,有些代码直接使用对象的布尔值判断
content = "helo"
if content:
    print(f"hi {content}")
else:
    print("空字符串")
lst = [1,2]
if lst:
    print(f"lst: {lst}")
else:
    print("空列表")

P111 成员方法

1. 基本介绍

在这里插入图片描述

2. 成员方法的定义和基本使用

  • 成员方法的定义

在类中定义成员方法和前面学习过的定义函数,基本是一样的(原理和运行机制是一样),但是还是有点不同(形式上有不同)

在这里插入图片描述

# 案例演示
#     定义一个Person类(name, age),完成如下要求:
#     1)添加hi成员方法, 输出"hi,python"
#     2)添加ca101成员方法, 可以计算从1 +..+1000的结果
#     3)添加cal02成员方法, 该方法可以接收一个数n,计算从1 +..+n的结果
#     4)添加get_sum成员方法, 该方法可以计算两个数的和并返回


class Person():
    age = None
    name = None

    def hi(self):
        print("hi,python")

    def cal01(self):
        for i  in range(1,1001):
            sum +=i
        print(f"从1 +..+1000的结果:{sum()}")

    def cal02(self,n):
        for i  in range(1,n+1):
            sum +=i
        print(f"从1 +..+1000的结果:{sum()}")

    def get_sum(self, n1,n2):
        return  n1+n2


p=Person()
p.hi()
p.cal01()
p.cal02()
p.get_sum(1,2)

3.注意事项和使用细节

  1. Python 也支持对象动态的添加方法
# 函数
def hi():
    print("hi, python")

#定义类
class Person:
    name = None
    age = None
   
    def ok(self):
        print("ok()")

# 创建了对象p和p2
p = Person()
p2 = Person()

#1.动态的给p对象添加方法m1,注意只是针对p对象添加方法
#2. m1是你新增加的方法的名称,由程序员指定名字
#3.即m1方法和函数hi关联起来,当调用m1方法时,会执行hi函数
p.m1 = hi
#调用m1(即hi)
p.m1()
#因为没有动态的给p2添加方法,会报错
p2.m1()  # AttributeError


print(type(p.m1), type(hi)) # <class 'function'> <class 'function'>
print(type(p.ok)) # <class 'method'>

P112 Python_self

1). self 的基本介绍


#定义类
class Dog:
    name = "波斯猫"
    age = 2

    def info(self,name):
        print(f"name:{name}")
        # 通过self.属性名/成员变量
        print(f"成员变量name:{self.name}")
# 创建了对象p和p2
dog = Dog()
dog.info("加菲猫")



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

2). @staticmethod

在这里插入图片描述

#定义类
class Dog:
    name = "藏獒"
    age = 2

    def info(self,name):
        print(f"name:{name}")
        # 通过self.属性名/成员变量
        print(f"成员变量name:{self.name}")
    #  静态方法
    # 张老师解读:
        # 1. 通过@staticmethod 可以将方法转为静态方法
        # 2. 如果是一个静态方法可以省略self
        # 3.

    @staticmethod
    def ok():
        print("ok()...")
# 创建了对象p和p2
dog = Dog()
dog.info("德牧")

Dog.info("哈哈") # 会报错不能这么写
# 调用静态方法 
dog.ok()
# 方式2: 通过类名调用
Dog.ok()

3). self代表当前对象本身

在这里插入图片描述

class Dog:
    name = "藏獒"
    age=2

    def hi(self):
        print(f"hi self: {id(self)}")
#self表示当前对象本身

#创建对象dog2
dog2 = Dog()
print(f"dog2: {id(dog2)}")
dog2.hi()

#创建对象dog3
dog3 = Dog()
print(f"dog3: {id(dog3)}")
dog3.hi()

4). 当我们通过对象调用方法时,self 会隐式的传入

5). 在方法内部,要访问成员变量和成员方法,需要使用self

class Dog:
    name ="藏獒"
    age = 2
    def eat(self):
         print(f"{self.name} 饿了..") #藏獒饿了..

    def cry(self, name):
        print(f"{name} is crying") #金毛 is crying
        print(f"{self.name} is crying") #金毛饿了..
        self.eat()
#不能直接调用
# eat()
dog = Dog()
# dog.name  = "中华田园犬"
dog.cry("金毛")
  • 课堂练习题
# ●定义Person类
# 1)里面有name、age属性
# 2)并提供compare_to比较方法,用于判断是否和另一个人相等
# 3)名字和年龄都一样,就返回True,否则返回False
class Person:
    name = None
    age = None

    # 名字和年龄都一样,就返回True,否则返回False
    # def compare_to(self,name,age):
    #     return name == self.name and age == self.age
    def compare_to(self, other):
        return self.name == other.name and self.age == other.age

#测试
p1 = Person()
p1.name = 'tim'
p1.age = 3

p2 = Person()
p2.name = 'tim'
p2.age = 3

print(p1.compare_to(p2))

P113 对象作为参数传递

  • 代码分析
# ●定义Person类
# 1)里面有name、age属性
# 2)并提供compare_to比较方法,用于判断是否和另一个人相等
# 3)名字和年龄都一样,就返回True,否则返回False
class Person:
    name = None
    age = None

def f1(person):
    print(f"②person的地址:{id(person)}")

    person.name = 'jam'
    person.age +=1

#测试
p1 = Person()

p1.name = 'jordan'
p1.age = 21


print(f"①p1的地址:{id(p1)} p1.name: {p1.name} p1.age: {p1.age}")

f1(p1)
print(f"①p1的地址:{id(p1)} p1.name: {p1.name} p1.age: {p1.age}")

  • 对象作为参数传递示意图
    在这里插入图片描述

P114 作用域

  1. 在面向对象编程中,主要的变量就是成员变量(属性)和局部变量

在这里插入图片描述

2、我们说的局部变量,一般是指在成员方法中定义的变量

3、作用域的分类:属性作用域为整个类,比如 Cat类:cry eat 等方法使用属性【举例】

class Cat:
    name = None
    age = None

    # n1,n2,result就是局部变量
    def cal(self,n1,n2):
        result = n1+ n2
        print("result: ",result)
        print("cal()使用属性name",self.name)

    def cry(self):
        print("cry()使用属性name",self.name)

    def eat(self):
        print("eat()使用属性name", self.name)


cat = Cat()

cat.cal(10,20)
cat.cry()
cat.eat()


cat.name = " zoran"
cat.age = 20

cat.cry()
cat.eat()
  1. 局部变量:也就是方法中定义的变量,作用域只在的方法
  1. 属性局部变量可以重名,访问时带上self,表示访问的属性,没有带self,则是访问局部变量
class Cat:
    name = None
    age = None

    def hi(self):
        name = "皮皮"
        print(name)
        print(self.name)

cat = Cat()
cat.name = "小美"
cat.hi()

P114 构造方法

1. 基本介绍

在这里插入图片描述

2. 构造方法的解读

2.1 在初始化对象时,会自动执行_init_方法


class Person:
    name = None
    age = None

    # 构造方法/构造器
    def __init__():
        print("__init__执行le",name)
        self.name = name


# 后面的__init()__生效
p1 = Person()

2.2 在初始化对象时,将传入的参数,自动传递给 init方法


class Person:
    name = None
    age = None


    # 构造方法/构造器
    def __init__(self,name,age):
        print("__init__执行le",name,age)
        # 解读
        # 1. 把接收到的name和age赋给属性(name,age)
        # 2. self 就是你当前创造的对象
        self.name = name
        self.age = age

p1 = Person("kobe",20)
print(f"p1.id:{id(p1)}")
print(f"p1的信息:{p1.name}{p1.age}")

p2= Person("tim",30)
print(f"p1.id:{id(p2)}")
print(f"p1的信息:{p2.name}{p2.age}")

2.3 构造方法是py预定义的,名称是__init__,注意init 的前后都有两个

3. 构造方法的注意事项和使用细节

1. init一个类只有一个方法,即使你写了多个,也只有最后一个生效


class Person:
    name = None
    age = None


    # 构造方法/构造器
    def __init__(self,name,age):
        print("__init__执行le",name,age)
        self.name = name
        self.age = age

    def __init__(self,name):
        print("__init__执行le",name)
        self.name = name

 #报错
# 后面的__init()__生效
p1 = Person("kobe",20)



p1 = Person("kobe")
print(f"p1的 name={p1.name} age={p1.age}") # kobe I

2、python可以动态的生成对象属性,代码说明


class Person:
  
    # 构造方法/构造器
    def __init__(self,name,age):
        print("__init__执行le",name,age)
        # 将接收到的name和age 赋给 当前对象的name和age属性
        
        # Python支持动态生成对象属性
        self.name = name
        self.age = age

p1 = Person("tim",30)

print(f"p1的 name={p1.name} age={p1.age}") # kobe I

  1. 构造方法不能有返回值,比如,你返回字符串,会报"TypeError:
    init()should return None,not’str

116 本章练习题

# # 编写类A01,
# # 定义方法max,实现求某个float列表list =[1.1,2.9,-1.9,67.9]的最大值,并返回



# class A01:
#     def max(self,my_list):
#         return max(my_list)
#
# a = A01()
# list1 = [1.1,2.9,-1.9,67.9]
# print(max(list1))

# 2、编写类Book,定义方法update price,实现更改某本书的价格,
# 具体:如果价格>150,则更改为150,
# 如果价格>100,更改为100,否则不变 homework02.py

class Book:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def update_price(self):
        if self.price > 150:
            self.price = 150
        elif self.price > 100:
            self.price = 100

    def info(self):
        print(f"{self.name} 价格: {self.price}")


book = Book("新华字典", 120)
# book.info()
book.update_price()
# book.info()

# 03 定义一个圆类Circle,
# 定义属性:半径,
# 提供显示圆周长功能的方法,
# 提供显示圆面积的方法 homework03.py 3min
import math

class Circle:
    radius = None

    def __init__(self, radius):
        self.radius = radius

    def area(self):  # 面积
        return math.pi * (self.radius) * (self.radius)

    def girth(self):  # 周长
        return 2 * math.pi * self.radius

    def info(self):
        print("圆面积: ",self.area().__round__(2), "圆周长: ",self.girth().__round__(2))


circl = Circle(10)
# circl.info()
# 04编程创建一个Cal计算类,
# 在其中定义2个成员变量表示两个操作数,
# 定义四个方法实现求和、差、乘、商(要求除数为0的话,要提示)
# 并创建对象,分别测试 homework04.py
class Cal:
    x = None
    y = None

    def __init__(self,x,y):
        self.x = x
        self.y = y

    def addtion(self):
        return self.x + self.y

    def subtraction(self):
        return self.x - self.y

    def multiplication(self):
        return self.x * self.y

    def divison(self):
        if self.y ==0:
            return "输入有误,除数不能为0"
        else:
            return self.x / self.y
    def info  (self):
        print(f"和: {self.addtion()},\n差: {self.subtraction()},\n积: {self.multiplication()},\n商: {self.divison()}")

cal = Cal(10,0)
# cal.info()
# 5、定义Music类,
# 里面有音乐名name、
# 音乐时长times属性,
# 并有播放play功能,和返回本身属性信息的方法

class Music:
    name = None
    times = None

    def __init__(self,name,times):
        self.name = name
        self.times =  times

    def play(self):
        print(f"音乐: {self.name}正在播放中,"
              f"时长为: {self.times} min")

    def get_info(self):
        return self.name,self.times

mus = Music("克罗地亚狂想曲",10)
# mus.play()
# print(mus.get_info())

# 06 代码分析题
class Demo:
    i=100
    def m(self):
        self.i += 1 #101
        j= self.i #101
        print("i=", self.i)
        print("j=",j)
# d1 = Demo()
# d2 = d1
# d2.m()
# print(d1.i)
# print(d2.i)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pigerr杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值