# 请把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性:
class Student(object):
def __init__(self, name, gender):
self.name = name
self.__gender = gender
def set_gender(self, gender):
self.__gender = gender
print(gender)
def get_gender(self):
return self.__gender
ein_sehr_sehr_böser_student = Student('Alex','male')
print(ein_sehr_sehr_böser_student.get_gender())
print(ein_sehr_sehr_böser_student._Student__gender) # 这是在做坏事
# 继承
class Studentin(Student):
def set_gender(self, gender):
if gender == 'male':
print('you sure???')
else:
self.__gender = gender
Hahna = Studentin('Ahrent', 'female')
print('Hahna: ', Hahna.get_gender())
Hahna.set_gender('male')
def list_student(student):
print('name: ', student.name)
print('genger: ', student.get_gender())
# dir(), hasattr(), setattr(), getattr() ( 竟然用了第三人称单数,也是够了)
class MyObject(object):
def __init__(self, x = 9):
self.x = x
def power(self):
return self.x * self.x
this_is_an_object = MyObject()
print(hasattr(this_is_an_object,'x'))
setattr(this_is_an_object, 'x', 19)
print(getattr(this_is_an_object, 'x'))
print(hasattr(this_is_an_object, 'y'))
setattr(this_is_an_object, 'y', 20)
print(hasattr(this_is_an_object, 'y'))
print(getattr(this_is_an_object, 'y'))
# 实例属性和类属性
# 为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:
class Studentinen():
__count = 0
def __init__(self, name):
self.name = name
Studentinen.__count += 1 # not self.__count !!!
print('total number: ', Studentinen.__count)
@classmethod
def studenten_nummer(cls):
print('the number of students is: ', cls.__count) # cls(class) / cls.__count equals Studentinen.__count
Lisa = Studentinen("Lisa")
Siri = Studentinen('Siri')
Sami = Studentinen('Sami')
Sami.studenten_nummer()
# 给实例绑定方法
def set_score(self, score):
self.__score = score
print('score has been set to: ', self.__score)
from types import MethodType
Lisa.set_score = MethodType(set_score, Lisa)
Lisa.set_score(98)
# Siri.set_score(100) # 针对于实例所绑定的方法,只对该实例有效,无法应用于所有实例
# 为了给所有实例都绑定方法,可以给class绑定方法
Studentinen.set_score = set_score # 不需要使用methodtype
Siri.set_score(100)
# 使用__slots__限制实例的属性
class Student(object):
def __init__(self, name, gender, score = 0):
self.name = name
self.__gender = gender
self.score = score
__slots__ = ('name', '__gender') # 使用slots 限制
def set_gender(self, gender):
self.__gender = gender
print(gender)
def get_gender(self):
return self.__gender
Alex = Student('Alex', 'male')
print(Alex.get_gender())
Alex.score = 100
print(Alex.score)
class Studentin(Student):
def set_gender(self, gender):
if gender == 'male':
print('you sure???')
else:
self.__gender = gender
hahna = Studentin('Hahna','female')
hahna.score = 100 # __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
print(hahna.score)
class Studentin(Student):
__slots__ = ('name', 'gender')
def set_gender(self, gender):
if gender == 'male':
print('you sure???')
else:
self.__gender = gender
Alexis = Studentin('Alexis', 'female') # 子类实例允许定义的属性就是自身的__slots__加上父类的__slots__
Alexis.score = 100
# 请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution
class Screen(object):
@property
def width(self): # you can't change the name of the method
return self._width
@width.setter
def width(self, width): # you can't change the name of the method
self.__width = width
@property
def height(self):
return self.__height
@height.setter
def height(self, height):
self.__height = height
@property
def resolution(self):
return self.__height * self.__width
s = Screen()
s.width = 1024
s.height = 768
print(s.resolution)
# 定制类
# __str__
class Teacher(object):
def __init__(self, name):
self.name = name
print(Teacher('Alex'))
# <__main__.Teacher object at 0x10c97d3c8>
class Teacher(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Teacher Object, (name: %s)' % self.name
print(Teacher('Alex'))
# Teacher Object, (name: Alex)
class Teacher(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Teacher Object, (name: %s)' % self.name
__repr__ = __str__
# __iter__
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1
# !!!
def __iter__(self):
return self
def __next__(self):
self.a , self.b = self.b, self.a + self.b
if self.a > 100:
raise StopIteration
return self.a
for i in Fib():
print(i)
# __getitem__()
class Fib2(object):
def __init__(self):
self.a, self.b = 0, 1
def __getitem__(self, n):
self.a, self.b = 1, 1
for i in range(n):
self.a, self.b = self.b, self.a + self.b
return self.a
print(Fib2()[5])
# 添加切片功能
class Fib3(object):
def __getitem__(self, n):
a, b = 1, 1
if isinstance(n, int):
for i in range(n):
a, b = b, a + b
return a
elif isinstance(n, slice):
start = n.start
stop = n.stop
if start is None:
start = 0
L = []
for i in range(stop):
if i >= start:
L.append(a)
a, b = b, a + b
return L
print('calling single selected element: %d' % Fib3()[6])
print('calling slice: %s' % Fib3()[0:6])
Class
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 我遇见的错误(拷贝):Undefined symbols for architecture arm64:"OBJC...
- org.springframework.beans.factory.UnsatisfiedDependencyEx...
- __CLASS__will return the name of the class in which the t...
- A class can be made static only if it is a nested class. ...
- 平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思...