日期: 2022-09-21 05:37:03 浏览数:4

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
广元爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广

def intro(self):
print(f'My name is {self.name},I'm {self.age}')
def get_var(self):
print(self.__privater_var)
def set_var(self, var):
self.__privater_var = var
someone = People(name='jack', age=20)
someone.intro()
print(someone.age)
someone.get_var() # 通过get_var方法访问私有属性__privater_var,值为10
someone.set_var(30) # 通过set_var方法修改私有属性__privater_var,值为30
someone.get_var() # 再次通过get_var方法访问私有属性__privater_var,值为30
结果:
My name is jack,I'm 20
20
10
30
接下下来看看为什么我们使用someone.__privater_var会报错呢?
AttributeError: 'People' object has no attribute '__privater_var'
这里我们先使用 dir() 函数:
print(dir(someone)) # 获得当前someone的属性列表
结果:
['_People__privater_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'get_var', 'intro', 'name', 'set_var']
从打印出的结果中,我们并没有找到'_peivater_var'但是我们看到一个'_People__privater_var'.有没有想到什么?原来是被重命名了。好,我们来试试:
print(someone._People__privater_var)
someone._People__privater_var = 40
print(someone._People__privater_var)
结果:
30
40
所以说,私有变量的属性是可以修改的。既然Python阻止访问,一般情况下就不要访问。
日日夜夜
日日夜夜
dwl***t30@gmail.com
2年前 (2020-04-23)
真心
297***2808@qq.com
5
上面给的 people 类定义混淆了类属性与实例属性,下面我给出自己改写的 People 定义予以证明:
# 类定义
class People:
name = 'nnnnnn' #这个是类属性
age = 20 #这个也是类属性
__weight = 21 #这个也是类属性,且是私有的
# 定义构造方法
def __init__(self, name, age, weight):
self.name = name #这里改写的是实例属性,与类属性没有关联
self.age = age #这里改写的是实例属性,与类属性没有关联
self.__weight = weight #实例属性, 这里改写的是实例属性,与类属性没有关联
#People.__weight = weight
def speak(self):
print("说: 我叫 {0},{1} 岁,体重{2}斤(实例属性)" .format(self.name, self.age, self.__weight))
def speak2(self):
print("私有类属性__weight = {0}".format(People.__weight))
p1 = People('张三', 10, 60)
p1.speak()
p1.speak2()
print("类属性:name={0}, age={1}".format(People.name, People.age))
p2 = People('李四', 12, 69)
p2.speak()
p2.speak2()
print("类属性:name={0}, age={1}".format(People.name, People.age))
运行结果:
说: 我叫 张三,10 岁,体重60斤(实例属性)
私有类属性__weight = 21
类属性:name=nnnnnn,
广元爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
的二元方法运算符重载介绍的并不全面,文中介绍的全是正向方法,其实还有反向方法,就地方法。下面补充一些。
当解释器碰到 a+b 时,会做以下事情:
从 a 类中找 __add__ 若返回值不是 NotImplemented, 则调用 a.__add__(b)。
若 a 类中没有 __add__ 方法,则检查 b 有没有 __radd__ 。如果如果有,则调用 b.__radd__(a),若没有,则返回 NotImplemented。
接上条,若 b 也没有 __radd__ 方法,则抛出 TypeError,在错误消息中知名操作数类型不支持。
比如:向量类 <Myvector> 应当有向量与整数的乘法:
期望得到 b*a 也返回一个向量,b*a 应该等于 a*b。此时就需要在 Myvector 类中定义一个__rmul__方法。
每个运算符都有正向方法重载,反向方法重载。有一些有就地方法(即不返回新的对象,而是修改原本对象)。
兔子
8bi***gmail.com
shunhwa
hex***ua617@sina.com
__str__函数
__str__ 是一个类的方法,在打印类对象,获取其属性信息时调用。打印一个实例化对象时,默认打印的其实时一个对象的地址,但是我们可以对其进行重载,打印我们想要的信息。例如上面的例子中进行的重载。
shunhwa
hex***ua617@sina.com
小叶Little_Ye
lit***ye233@foxmail.com
在类的方法中直接修改 self 是无效操作,即使 self 变量的地址与实例地址相同:
小叶Little_Ye
lit***ye233@foxmail.com
日日夜夜
dwl***t30@gmail.com
事实上 class 的私有属性在外部也是可以访问的我们可以看下文中的例子。
#!/usr/bin/python3class People: def __init__(self, name, age, ): self.name = name self.age = age self.__privater_var = 10 def intro(self): print(f'My name is {self.name},I'm {self.age}') def get_var(self): print(self.__privater_var) def set_var(self, var): self.__privater_var = varsomeone = People(name='jack', age=