您身边的网站建设专家
成功案例

【建站服务】广元爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广-域名申请

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


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


广元爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广

网站建设.png

  1. 的二元方法运算符重载介绍的并不全面,文中介绍的全是正向方法,其实还有反向方法,就地方法。下面补充一些。

    当解释器碰到 a+b 时,会做以下事情:

    从 a 类中找 __add__ 若返回值不是 NotImplemented, 则调用 a.__add__(b)

    若 a 类中没有 __add__ 方法,则检查 b 有没有 __radd__ 。如果如果有,则调用 b.__radd__(a),若没有,则返回 NotImplemented。

    接上条,若 b 也没有 __radd__ 方法,则抛出 TypeError,在错误消息中知名操作数类型不支持。

    比如:向量类 <Myvector> 应当有向量与整数的乘法:

    >>>a = Myvector([1,2,3])>>>print(a.value)[1,2,3]>>>b=3>>>c = a*b   #此时调用Myvector.__mul__()>>>print(c.value)[3,6,9]>>> d=b*a  #这句会出错。

    期望得到 b*a 也返回一个向量,b*a 应该等于 a*b。此时就需要在 Myvector 类中定义一个__rmul__方法。

    def __rmul__(self, other):
        if isinstance(other, int):
            return Myvector([a*other for a in self.m])

    每个运算符都有正向方法重载,反向方法重载。有一些有就地方法(即不返回新的对象,而是修改原本对象)。

    兔子

       兔子

      8bi***gmail.com

    3年前 (2019-08-02)
  2.    shunhwa

      hex***ua617@sina.com

    41

    __str__函数

    __str__ 是一个类的方法,在打印类对象,获取其属性信息时调用。打印一个实例化对象时,默认打印的其实时一个对象的地址,但是我们可以对其进行重载,打印我们想要的信息。例如上面的例子中进行的重载。

    shunhwa

       shunhwa

      hex***ua617@sina.com

    3年前 (2019-08-28)
  3.    小叶Little_Ye

      lit***ye233@foxmail.com

    14

    在类的方法中直接修改 self 是无效操作,即使 self 变量的地址与实例地址相同:

    class C:
      def __init__(self, a):
        self.a = a  def construct(self, a):
        c = C(a)
        self = c  def getid(self):
        return id(self)if __name__ == '__main__':
      c1 = C(2)
      c1.construct(3) # c1.a == 2
      print(id(c1) == c1.getid()) # True
    小叶Little_Ye

       小叶Little_Ye

      lit***ye233@foxmail.com

    3年前 (2020-02-11)
  4.    日日夜夜

      dwl***t30@gmail.com

    66

    事实上 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=



    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(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站