标签:recent state instance 存在 继承 mod yield over info
这里记录一下python中关于class类的一些知识。不解释就弄不懂的事,就意味着怎样解释也弄不懂。
class MyClass(): ‘‘‘A simple exampel class‘‘‘ i = 12345 # class variable shared by all instances def __init__(self, realpart, imagpart): self.real = realpart # instance variable unique to each instance self.imag = imagpart def f(self): return self.real + ‘hello‘ x = MyClass(‘huhx‘, ‘linux‘) print(x.real, x.imag, x.i, MyClass.i) # MyClass.real会报错 print(MyClass.__doc__, x.__doc__) # A simple exampel class print(MyClass.f(x), x.f()) # huhxhello huhxhello
1 class Dog(): 2 tricks = [] 3 4 # def __init__(self): 5 # self.tricks = [] 6 7 def add_tricks(self, trick): 8 self.tricks.append(trick) 9 d = Dog() 10 d.add_tricks(‘roll over‘) 11 e = Dog() 12 e.add_tricks(‘play dead‘) 13 print(d.tricks, e.tricks) # [‘roll over‘, ‘play dead‘] [‘roll over‘, ‘play dead‘]
如果注释掉第二行,打开4、5行。运行的结果:[‘roll over‘] [‘play dead‘]。类的方法还可以定义在类的外面,测试用例如下:
def f1(self, x, y): return min(x, y) class C(): f = f1 def g(self): return ‘hello world‘ h = g classC = C() print(C.f(classC, 2, 45), classC.f(2, 45)) # 2 2 print(classC.h()) # hello world classC.h = ‘hello abc‘ print(classC.g(), classC.h) # hello world hello abc
上述的例子可以看到f1定义在类C的外面,可以正常使用。而且在类中赋值h = g,修改h的值。不会影响到g,说明类中的方法赋值是值传递。
python的继承语法如下,可以支持多层继承。
class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N>
关于python的私有变量,提供下述的代码:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score self._name = name def print_score(self): print(‘%s: %s‘ % (self.__name, self.__score)) bart = Student(‘Bart Simpson‘, 59) # print(bart.__name) # AttributeError: ‘Student‘ object has no attribute ‘_name‘ print(bart._Student__name) print(bart._name) # 约定是外部不能访问,但是实际上外部可以访问。 print(type(bart)) # <class ‘__main__.Student‘> print(isinstance(bart, Student), issubclass(Student, object)) # True True
python中可以定义一个空的类,属性和方法可以自行添加。
class Employee: pass john = Employee() # Create an empty employee record # Fill the fields of the record Employee.name = ‘John Doe‘ john.dept = ‘computer lab‘ john.salary = 1000 print(john.name) # John Doe
# one way for ele in [1, 2, 3]: print(ele, end=‘ ‘) print() # iter s = ‘abc‘ it = iter(s) print(next(it), next(it), next(it), end=‘ ‘) print() # Generators def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] for char in reverse(‘huhx‘): print(char, end=‘ ‘) print() # class next and iter class Reverse: """Iterator for looping over a sequence backwards.""" def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] rev = Reverse(‘linux‘) for char in rev: print(char, end=‘ ‘) # 1 2 3 # a b c # x h u h # x u n i l
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
class Student(object): __slots__ = (‘name‘, ‘age‘) s = Student() s.name = ‘huhx‘ s.age = 45 s.score = 45
运行会报错:
Traceback (most recent call last): File "G:/Java/Go/program/2017-05-18/LearnPython1/test10/huhx5.py", line 8, in <module> s.score = 45 AttributeError: ‘Student‘ object has no attribute ‘score‘
Python内置的@property装饰器就是负责把一个方法变成属性调用的。当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, ‘score‘)来尝试获得属性。__str__()方法类似于java类中的toString方法。如下案例
class Student(object): @property def score(self): return ‘score = ‘ + str(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 def __str__(self): return ‘student info: ‘ + self.score def __getattr__(self, item): if item == ‘address‘: return ‘china‘ elif item == ‘attr_fun‘: return lambda x: x * x s = Student() s.score = 60 print(s.score) # score = 60 print(s.address) # china print(s.attr_fun(4)) # 16 print(s) # student info: score = 60 s.score = 999 # 抛出异常
标签:recent state instance 存在 继承 mod yield over info
原文地址:http://www.cnblogs.com/huhx/p/baseuselearnpython6.html