Python

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
'小红'

上一篇下一篇

猜你喜欢

热点阅读