Class

2017-12-24  本文已影响0人  Modelstrategy
# 请把下面的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])


上一篇下一篇

猜你喜欢

热点阅读