鱼C论坛

 找回密码
 立即注册
查看: 2379|回复: 8

有关self指针的问题

[复制链接]
发表于 2022-4-17 00:31:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
完了 ,完了 这个self 指针的含义完全搞不懂。。。。  导致作业不明白这个报错

class Price():
    def __init__(self, weekend = 0 , child = 0):
        self.price = 100
        if child :
            self.price = 0.5 * self.price
        if weekend:
            self.price = 1.2 * self.price

        def cal_price(self,num):
            return self.price * num

adult = Price()
print(adult.cal_price(2))
--------------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Users/zhuzj/Desktop/python/test/老教材/37.py", line 24, in <module>
    print(adult.cal_price(2))
AttributeError: 'Price' object has no attribute 'cal_price'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-17 00:33:01 | 显示全部楼层
本帖最后由 isdkz 于 2022-4-17 00:34 编辑

这跟 self 无关,意思是你的 Price 对象没有 cal_price 这个属性,

因为你的缩进错误了,导致 cal_price 成为了 __init__ 方法中的内嵌函数
class Price():
    def __init__(self, weekend = 0 , child = 0):
        self.price = 100
        if child :
            self.price = 0.5 * self.price
        if weekend:
            self.price = 1.2 * self.price

    def cal_price(self,num):                        # 缩进问题
        return self.price * num                       # 缩进问题

adult = Price()
print(adult.cal_price(2))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 00:37:54 | 显示全部楼层
isdkz 发表于 2022-4-17 00:33
这跟 self 无关,意思是你的 Price 对象没有 cal_price 这个属性,

因为你的缩进错误了,导致 cal_price ...

我错了  大晚上了 脑子不太好使了。。

大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是理解的不是很明白为什么要用这个self, 我目前的理解就是,从class中生成实例,可以给特定的实例引用这个self 默认是指向这个实例,然后给他从类中赋予属性或者更改属性。。  是这个意思么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 00:40:49 | 显示全部楼层
Victor0321 发表于 2022-4-17 00:37
我错了  大晚上了 脑子不太好使了。。

大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是 ...

在面向对象编程中,命名空间从全局与局部上升到类与对象

想要访问某个主体(类或对象)的命名空间用 . 来访问,. 表示的,比如 Human.eye 表示人类的眼睛,xiaoming.eye 表示小明的眼睛,

在面向对象中不止两个不同的主体中需要一个称呼来辨别是谁的,同一个主体也需要一个称呼,这个称呼就是self,

self就是自己的意思

在对象与对象或由对象本身产生的操作中得确定是哪个对象产生的动作(方法),需要用到哪个对象的属性

这时候就需要一个称呼来确定是哪个对象

不同的对象之间称呼用名字即可,就比如你要找某个人称呼他的名字即可,

但是自己称呼自己总不能也叫名字吧,就像你称呼自己也不会用名字来称呼一样,通常我们用“我”,

就像python约定俗成地用self一样,这个self是由python解释器自动传给第一个形参的

不过这不是硬性规定地,就比如你自己可以称呼自己为“本人”、“某”,

python里面形参的名字也是可以随意变动的,self作为对象方法的形参,名字也是可以随意改动的,

可以把self换成别的名字

但是最好使用约定俗成的方式,有利于别人阅读你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-17 00:46:05 | 显示全部楼层
Victor0321 发表于 2022-4-17 00:37
我错了  大晚上了 脑子不太好使了。。

大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是 ...


因为在定义类的时候不知道实例化后的对象要用什么名字,

而且一个类肯定不止实例化一个对象,所以在定义方法的时候需要用到对象的属性的话不能用它的名字来访问,

那得有一个自己访问自己的属性时使用的名字,这个名字就是 self,相当于人类中的 '我','I’
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 00:53:52 | 显示全部楼层
isdkz 发表于 2022-4-17 00:46
因为在定义类的时候不知道实例化后的对象要用什么名字,

而且一个类肯定不止实例化一个对象,所以在 ...

好像有点感觉了,有点意思就是明确对象的属性。因为类可以创建无数个对象,所以所有的类就默认了第一个形参都是实例的名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-17 00:56:33 | 显示全部楼层
Victor0321 发表于 2022-4-17 00:53
好像有点感觉了,有点意思就是明确对象的属性。因为类可以创建无数个对象,所以所有的类就默认了第一个形 ...


准确的说是实例的地址,解释器会自动把实例的地址传给方法的第一个参数,

用于在方法中通过第一个参数来访问实例的属性,而这第一个参数约定俗成地使用了 self 这个名字,self 的中文意思是自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 02:02:23 | 显示全部楼层
isdkz 发表于 2022-4-17 00:56
准确的说是实例的地址,解释器会自动把实例的地址传给方法的第一个参数,

用于在方法中通过第一个参 ...

这两个class 的关于move的函数是不是有办法可以在外部弄一个函数,然后在定义这两个class.move()的时候再调用外部这个函数么?

class Turtle:
    def __init__(self):
        # 初始体力
        self.power = 100
        # 初始位置随机
        self.x = r.randint(legal_x[0], legal_x[1])
        self.y = r.randint(legal_y[0], legal_y[1])

    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
        new_x = self.x + r.choice([1, 2, -1, -2])
        new_y = self.y + r.choice([1, 2, -1, -2])
        # 检查移动后是否超出场景x轴边界
        if new_x < legal_x[0]:
            self.x = 2 * legal_x[0] - new_x
        elif new_x > legal_x[1]:
            self.x = 2 * legal_x[1] - new_x
        else:
            self.x = new_x
        # 检查移动后是否超出场景y轴边界

        if new_y < legal_y[0]:
            self.y = 2 * legal_y[0] - new_y
        elif new_y > legal_y[1]:
            self.y = 2 * legal_y[1] -  new_y
        else:
            self.y = new_y        
        # 体力消耗

        self.power -= 1
        # 返回移动后的新位置
        return (self.x, self.y)

    def eat(self):
        self.power += 20
        if self.power > 100:
            self.power = 100



class Fish:
    def __init__(self):
        self.x = r.randint(legal_x[0], legal_x[1])
        self.y = r.randint(legal_y[0], legal_y[1])
        
    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
        new_x = self.x + r.choice([1, -1])
        new_y = self.y + r.choice([1, -1])
        # 检查移动后是否超出场景x轴边界
        if new_x < legal_x[0]:
            self.x = 2 * legal_x[0] - new_x
        elif new_x > legal_x[1]:
            self.x = 2 * legal_x[1] - new_x
        else:
            self.x = new_x
        # 检查移动后是否超出场景y轴边界

        if new_y < legal_y[0]:
            self.y = 2 * legal_y[0] -  new_y
        elif new_y > legal_y[1]:
            self.y = 2 * legal_y[1] -  new_y
        else:
            self.y = new_y
        # 返回移动后的新位置
        return (self.x, self.y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-17 02:54:04 | 显示全部楼层
'''
0. 可以对于相近的类,快速的定义
1. 报错,__init__函数返回必须是None
2. 会,如果还需要某些需要的属性或者方法可以用super().方法/属性()
3. 继承完鸟类的属性和方法后,对飞这个方法重新定义为Flase
4. 用于继承父类的属性
5.
6
'''


#动动手0
import random as r
import math as m

class Point:
    def __init__(self):
        self.y = r.randint(0,10)
        self.x = r.randint(0,10)
    def getco(self) :
        print(self.x , self.y)

class Line(Point):
    def __init__(self):
        self.y_A = r.randint(0,10)
        self.x_A= r.randint(0,10)
        self.y_B = r.randint(0,10)
        self.x_B = r.randint(0,10)
    def getLen(self):
        leng = (self.y_B - self.y_A) ** 2 + (self.x_B - self.x_A) ** 2
        return m.sqrt(leng)
   
line = Line()
line.getLen()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表