Python类和实例
2019-11-22 本文已影响0人
张磊_e325
#!usr/bin/env python3
# -*- coding: utf-8 -*-
'python默认第一个字符串是注释,可以用__doc__这个特殊变量引用'
# 作者名
__author__ = 'zhanglei'
class Student(object):
name = 'Student'
def __init__ (self, name, score, status):
self.name = name
self.score = score
self.__status = status
def get_status(self):
return self.__status
def set_status(self, status):
if 0 <= status <= 1:
self.__status = status
else:
raise ValueError('bad status')
def get_grade (self):
if self.score>=90:
return 'A'
elif self.score>=60:
return 'B'
else:
return 'C'
if __name__ == '__main__':
xm = Student('小明', 95, 1)
xg = Student('小刚', 55, 1)
print('%s:%s' % (xm.name, xm.get_grade()))
print('%s:%s' % (xg.name, xg.get_grade()))
print('%s:%s' % (xg.name, xg.get_status()))
print(xm._Student__status)
print(xm.__status)
关键词:class
继承和多态:(object)
如果没有其他需要继承的类,则默认继承(object)
#object -> Animal -> Dog -> Husky
class Animal (object):
def run(self):
print('Animal is running...')
class Dog(Animal):
def run(self):
print('Dog is running...')
class Husky(Dog):
def run(self):
print('Husky is running...')
# 通用方法,
def run_twice(animal):
animal.run()
animal.run()
多态这里和java有些区别,java中run_twice方法会限制参数是Animal或其子类,但是python只要是有run方法都可以执行run_twice方法。
准确来说run_twice方法的申明,animal和Animal一点关系没有,是动态申明
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
变量:
1、特殊变量:【__xxx__】 比如__name__,__author__,__doc__
2、私有变量:【__xxx】 比如 __status
3、虽然我可以被访问,但是,请把我视为私有变量,不要随意访问:【_xxx】
如上述代码中name='Student'
,这个是类的属性,可以用Student.name='Student'
调用
但是__init__
方法也有name参数,所以实例也有name属性。xm.name='小明'
如果此时删除实例的name属性del s.name
,此时xm.name='Student'
强烈建议不要类的属性和实例属性重名,实例的name会优先级高于类的name
对于私有变量:
class Student(object):
def __init__ (self, name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
# 1. 创建
>>> stu = Student('小红')
# 2. 通过封装的方法访问私有属性
>>> stu.get_name()
'小红'
# 3. 不允许直接访问
>>> stu.__name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
# 4. 赋值__name
>>> stu.__name='小紫'
# 5. 其实上一步赋值并不是实例的私有属性,而是一个新属性,见下一步
>>> stu.__name
'小紫'
# 6. 私有属性值没变
>>> stu.get_name()
'小红'
# 7. 其实python把私有属性变量名隐式转换了,也是可以直接访问的,但是强烈不建议
>>> stu._Student__name
'小红'