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

  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]

猜你喜欢

转载自blog.csdn.net/leavemetomorrow/article/details/88823532
今日推荐