Python学习笔记——class中的属性

本文介绍了Python3.x中如何在类中定制排序,重点讲解了__slots__特性,用于限制类的属性种类。同时阐述了如何创建私有属性以及其访问规则。通过示例展示了尝试直接修改私有属性时的内部机制,并讨论了使用内置装饰器设置getter和setter方法的重要性。最后,提到了如何使实例化的类变得可调用,即利用__call__方法。
  1. python3.x中没有cmp函数了,定制sorted排序时候,不可以直接return cmp(self.score,b.score)
    ,要进一步写详细。

  2. 限制属性种类——> __slots__

class Person(object):

    __slots__ = ('name', 'gender')

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

class Student(Person):

    __slots__ = ('score')

    def __init__(self, name, gender, score):
        super(Student, self).__init__(name,gender)
        self.score = score

在子类中,只需要声明一下额外添加的属性种类即可。
3. 一个普通的类,实例化后可以正常访问属性,可以正常为属性赋值。

class Person(object):

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
p = Person('Tom','Male')
print(p.name,p.gender)
#Tom Male
p.name = 'Alex'
p.gender = 'Female'
print(p.name,p.gender)
#Alex Female
  1. 将某个属性设置为私有属性,使变量名以双下划线开始即可。私有属性不可访问,不可赋值。
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender
p = Person('Tom','Male')
try:
    print(p.__gender)
except AttributeError:
    print('AttributeError when trying to access "private" property right after instantiation')
p.__gender = 'Female'
print(p.__gender)
#AttributeError when trying to access "private" property right after instantiation
#Female

对try语句进行稍微改动,再对比以下代码:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender
p = Person('Tom','Male')
try:
    print(p._Person__gender)
except AttributeError:
    print('AttributeError when trying to access "private" property right after instantiation')
p.__gender = 'Female'
print(p.__gender)
print(p._Person__gender)
#Male
#Female
#Male

python内所谓的“私有属性”:当在属性前加上双下划线时,类中并不会直接创建此__membername属性,而是会创建_classname__membername,这样在实例外部试图访问__membername时,会报错此属性不存在,因为确实不存在。当实例化后重新给“私有属性”赋值时,相当于重新创建了真正的__membername属性。切记,切记!

  1. 像4中的直接赋值固然可以,但如果需要对赋值有效性进行检验时,可以使用内置装饰器来设置对应属性的getter和setter方法。
class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.__score = score

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self, score):
        if score < 0 or score > 100:
            raise ValueError('invalid score')
        self.__score = score


s = Student('Bob', 59)
print(s.score) #此时其实是在调用score方法,而非__score属性

s.score = 60
print(s.score)

try:
    s.score = 300
except ValueError:
    print("ValueError just happened here when trying to assign an invalid value")
#59
#60
#ValueError just happened here when trying to assign an invalid value     
  1. 将一个实例化的类变成可调用对象—— __call__
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print('My name is %s...' % self.name)
        print('My friend is %s...' % friend)

p = Person('Bob', 'male')
p('Tim')
#My name is Bob...
#My friend is Tim...
class Fib(object):
    def __init__(self):
        self.list = []
    def __call__(self,num):
        L = []
        for i in range(num):
            if i != 0 and i != 1:
                L.append(L[i-1]+L[i-2])
            else:
                L.append(i)
        self.list = L
        return self.list
f = Fib()
print(f(10))
#[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值