千峰笔记-对象属性与类属性-动态添加-运算符重载

对象属性与类属性

 

class Person(object):

      #这里的属性实际上属于类属性(用类名来调用)

      def __init__(self, name):

            #对象属性

            self.name = name

 

print(Person.name)

per = Person(“Tom”)

#对象属性的优先级高于类属性

print(per.name)

#动态的给对象添加对象属性

per.age = 18#只针对于当前对象生效,对于类创建的其他对象没有作用

print(Person.name)

per2 = Person(“lilei”)

 

#删除对象中的name属性,再调用会使用到同名的类属性

del per.name

print(per.name)

 

#注意:不要将对象属性与类属性重名,因为对象属性会屏蔽掉类属性。但是当删除对象属性后,又能使用类属性了

 

动态给实例添加属性和方法

 

import types import MethodType

 

#创建一个空类

class Person(object):

      __slots__ = (“name”, “age”, “speak”)

 

per = Person()

#动态添加属性,这体现了动态语言的特点(灵活)

per.name = “tom”

print(per.name)

 

#动态添加方法///(偏函数)

def say(self):

      print(“my name is “ + self.name)

per.speak = MethodType(say, per)

per.speak()

 

 

如果想要限制实例的属性怎么办?

如,只允许给对象添加name,age,height,weight属性

 

定义类时,定义一个特殊的属性(__slots__),可以限制动态添加的属性

 

#per.height = 170

#print(per.height)

per.weight = 70

 

@property

 

可以允许对受限制访问的属性使用点语法

class Person(object):

      def __init__(self, age):

            #属性直接对外暴露

            #self.age = age

            #限制访问

            self.__age = age

      '''

      def getAge(self):

            return self.__age

      def setAge(self):

            if age < 0:

                  age = 0

            self.__age = age

      '''

      #方法名为受限制的变量去掉双下划线

      @property

      def age(self):

            return self.__age

      @age.setter    #去掉下划线.setter

      def age(self, age)

            if age < 0:

                  age = 0

            self.__age = age





per = Person(18)



#不安全,没有数据的过滤

per.age = -10



#使用限制访问,需要自己写set和get方法才能访问

#per.setAge(15)

#print(per.getAge())







per.age = 100   #相当于调用setAge

print(per.age)

 

运算符重载

print(1 + 2)

print(“1” + “2”)

#不同的类型用加法会有不同的解释



class Person(object):

      def __init__(self, num):

            self.num = num

      #运算符重载

      def __add__(self, other):

            return Person(self.num + other.num)

      def __str__(self):

            return “num = “ + str(self.num)



per1 = Person(1)

per2 = Person(2)

print(per1 + per2)  # per1 + per2 === per1.__add__(per2)

print(per1.__add__(per2))

print(per2)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值