有关self指针的问题
完了 ,完了 这个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' 本帖最后由 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)) isdkz 发表于 2022-4-17 00:33
这跟 self 无关,意思是你的 Price 对象没有 cal_price 这个属性,
因为你的缩进错误了,导致 cal_price ...
我错了大晚上了 脑子不太好使了。。
大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是理解的不是很明白为什么要用这个self, 我目前的理解就是,从class中生成实例,可以给特定的实例引用这个self 默认是指向这个实例,然后给他从类中赋予属性或者更改属性。。是这个意思么 Victor0321 发表于 2022-4-17 00:37
我错了大晚上了 脑子不太好使了。。
大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是 ...
在面向对象编程中,命名空间从全局与局部上升到类与对象,
想要访问某个主体(类或对象)的命名空间用 . 来访问,. 表示的,比如 Human.eye 表示人类的眼睛,xiaoming.eye 表示小明的眼睛,
在面向对象中不止两个不同的主体中需要一个称呼来辨别是谁的,同一个主体也需要一个称呼,这个称呼就是self,
self就是自己的意思,
在对象与对象或由对象本身产生的操作中得确定是哪个对象产生的动作(方法),需要用到哪个对象的属性,
这时候就需要一个称呼来确定是哪个对象,
不同的对象之间称呼用名字即可,就比如你要找某个人称呼他的名字即可,
但是自己称呼自己总不能也叫名字吧,就像你称呼自己也不会用名字来称呼一样,通常我们用“我”,
就像python约定俗成地用self一样,这个self是由python解释器自动传给第一个形参的,
不过这不是硬性规定地,就比如你自己可以称呼自己为“本人”、“某”,
python里面形参的名字也是可以随意变动的,self作为对象方法的形参,名字也是可以随意改动的,
你可以把self换成别的名字,
但是最好使用约定俗成的方式,有利于别人阅读你的代码 Victor0321 发表于 2022-4-17 00:37
我错了大晚上了 脑子不太好使了。。
大神既然在,能帮我讲讲这个 self 的具体作用么,,就是我还是 ...
因为在定义类的时候不知道实例化后的对象要用什么名字,
而且一个类肯定不止实例化一个对象,所以在定义方法的时候需要用到对象的属性的话不能用它的名字来访问,
那得有一个自己访问自己的属性时使用的名字,这个名字就是 self,相当于人类中的 '我','I’ isdkz 发表于 2022-4-17 00:46
因为在定义类的时候不知道实例化后的对象要用什么名字,
而且一个类肯定不止实例化一个对象,所以在 ...
好像有点感觉了,有点意思就是明确对象的属性。因为类可以创建无数个对象,所以所有的类就默认了第一个形参都是实例的名字 Victor0321 发表于 2022-4-17 00:53
好像有点感觉了,有点意思就是明确对象的属性。因为类可以创建无数个对象,所以所有的类就默认了第一个形 ...
准确的说是实例的地址,解释器会自动把实例的地址传给方法的第一个参数,
用于在方法中通过第一个参数来访问实例的属性,而这第一个参数约定俗成地使用了 self 这个名字,self 的中文意思是自己 isdkz 发表于 2022-4-17 00:56
准确的说是实例的地址,解释器会自动把实例的地址传给方法的第一个参数,
用于在方法中通过第一个参 ...
这两个class 的关于move的函数是不是有办法可以在外部弄一个函数,然后在定义这两个class.move()的时候再调用外部这个函数么?
class Turtle:
def __init__(self):
# 初始体力
self.power = 100
# 初始位置随机
self.x = r.randint(legal_x, legal_x)
self.y = r.randint(legal_y, legal_y)
def move(self):
# 随机计算方向并移动到新的位置(x, y)
new_x = self.x + r.choice()
new_y = self.y + r.choice()
# 检查移动后是否超出场景x轴边界
if new_x < legal_x:
self.x = 2 * legal_x - new_x
elif new_x > legal_x:
self.x = 2 * legal_x - new_x
else:
self.x = new_x
# 检查移动后是否超出场景y轴边界
if new_y < legal_y:
self.y = 2 * legal_y - new_y
elif new_y > legal_y:
self.y = 2 * legal_y -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, legal_x)
self.y = r.randint(legal_y, legal_y)
def move(self):
# 随机计算方向并移动到新的位置(x, y)
new_x = self.x + r.choice()
new_y = self.y + r.choice()
# 检查移动后是否超出场景x轴边界
if new_x < legal_x:
self.x = 2 * legal_x - new_x
elif new_x > legal_x:
self.x = 2 * legal_x - new_x
else:
self.x = new_x
# 检查移动后是否超出场景y轴边界
if new_y < legal_y:
self.y = 2 * legal_y -new_y
elif new_y > legal_y:
self.y = 2 * legal_y -new_y
else:
self.y = new_y
# 返回移动后的新位置
return (self.x, self.y)
'''
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()
页:
[1]