-
python3.x中没有cmp函数了,定制sorted排序时候,不可以直接return cmp(self.score,b.score)
,要进一步写详细。 -
限制属性种类——> __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
- 将某个属性设置为私有属性,使变量名以双下划线开始即可。私有属性不可访问,不可赋值。
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属性。切记,切记!
- 像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
- 将一个实例化的类变成可调用对象—— __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]