Python 初学(四)

今天主要了解了python的 部分规则

主要的内容都在下面的代码中,不一一细说了,代码中都有注释。

# by Fan 20180704

# # 1.使用__slots__
# ==>介绍
# 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
# ==>举例
class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

s = Student() # 创建新的实例
s.name = 'Michael' # 绑定属性'name'
s.age = 25 # 绑定属性'age'
# s.score = 99 # 绑定属性'score'
# ==>效果
# 由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。
# ==》需注意
# __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
# ==>例子效果
class GraduateStudent(Student):
    pass
g = GraduateStudent()
g.score=99



# # 2.@property
# ==>介绍
# # Python内置的@property装饰器就是负责把一个方法变成属性调用的
# ==>举例
class Student(object):

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

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
# s.score='111'
s.score = 60 # OK,实际转化为s.set_score(60)
# s.score = 9999

# ==> 举例练习

# 请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution:
#
# # -*- coding: utf-8 -*-
# # 测试:
# s = Screen()
# s.width = 1024
# s.height = 768
# print('resolution =', s.resolution)
# if s.resolution == 786432:
#     print('测试通过!')
# else:
#     print('测试失败!')


class Screen(object):
    __slots__ = ('width', 'height')
    @property
    def resolution(self):
        if self.width * self.height == 786432:
            return print('测试通过')
        else:
            return print('测试失败')

s1 = Screen()
s1.width = 1024
s1.height = 768
s1.resolution
# 上面这个举例把__slots__ 和 property 结合起来用,刚开始可能不太习惯,写多了,就没什么了

# # 3.多重继承
# 个人认为这个没什么要说的,直接代码看看就明白了
class Animal(object):
    pass

# 大类:
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

# 各种动物:
class Dog(Mammal):
    pass

class Bat(Mammal):
    pass

class Parrot(Bird):
    pass

class Ostrich(Bird):
    pass

class Runnable(object):
    def run(self):
        print('Running...')

class Flyable(object):
    def fly(self):
        print('Flying...')

# 继承
class Dog(Mammal, Runnable):
    pass
class Bat(Mammal, Flyable):
    pass

a1 = Dog()
a1.run()
a2 = Bat()
a2.fly()

# 测试 MixIn  (这个MixIn  我感觉只是 多重继承 的一种思想)
def mixin(pyClass, pyMixinClass, key=0):
    if key:
        pyClass.__bases__ = (pyMixinClass,) + pyClass.__bases__
    elif pyMixinClass not in pyClass.__bases__:
        pyClass.__bases__ += (pyMixinClass,)
    else:
        pass

class test1:
    def test(self):
        print('In the test1 class!')

class testMixin:
    def test(self):
        print('In the testMixin class!')

class test2(test1, testMixin):
    def test(self):
        print('In the test2 class!')

class test0(test1):
    pass

if __name__ == '__main__':
    print(test0.__mro__)  #继承了test1,object
    test_0 = test0()
    test_0.test()  #调用test1的方法
    mixin(test0, testMixin, 1)  #优先继承testMixin类
    test__0 = test0()
    test__0.test()  #由于优先继承了testMixin类,所以调用testMixin类的方法
    print(test0.__mro__)

    print(test2.__mro__)
    mixin(test2, testMixin)
    print(test2.__mro__)

# __str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的
class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Student object (name: %s)' % self.name
        __repr__ = __str__
print(Student('Michael'))


# 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,
# 然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

for n in Fib():
    print(n)


# 后记
# if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
# 当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行

猜你喜欢

转载自blog.csdn.net/mapeifan/article/details/80915164