2.4 python学习笔记

14)面向对象

https://www.runoob.com/python3/python3-class.html

https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368

 

1. 类和实例

 

 

 

注:它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 python 关键字,换成其他也可以运行

例如

In [1]: class Student:
   ...:     def __init__(lotus, name):
   ...:         lotus.name = name
   ...:     def prt(lotus):
   ...:         print(lotus.name)
   ...: 

In [2]: x = Student('snks')

In [3]: x.prt()
snks

 

类属性

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

注:在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

在类内部调用类的属性时需要加上类的名字

例如:

为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加

class Student(object):
    count = 0
    def __init__(self, name):
        self.name = name
        Student.count = Student.count + 1

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

 

2. 访问限制

class people:
    # 定义基本属性
    name = ''
    age = 0
    # 定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0

    # 定义构造方法
    def __init__(self, n, a, w):
        self.name = n
        self.age = a
        self.__weight = w

    def speak(self):
        print("%s 说: 我 %d 岁,超级无敌重:%d" % (self.name, self.age, self.__weight))

# 实例化类
p = people('runoob', 10, 30)
print(p.__weight)    ##结果raise AttributeError
p.speak()

 可以写专门的函数进行获取,如:

def get_weight(self):
    return self.__weight
##修改:
def set_weight(self, w):
    if w >=0 and w <= 500:
        self.__weight = w
    else:
        print('恭喜您的体重达到 %d 无人能及' % w)

注意注意:在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

错误写法

 

>>> bart = Student('Bart Simpson', 59)
>>> bart.get_name()
'Bart Simpson'
>>> bart.__name = 'New Name' # 设置__name变量!
>>> bart.__name
'New Name'

 

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量

>>> bart.get_name() # get_name()内部返回self.__name
'Bart Simpson'

 

3.继承

例子1:

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
  
s = student('ken',10,60,3)
s.speak()
##执行以上程序输出结果为: ken 说: 我 10 岁了,我在读 3 年级

例子2:

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):

    def run(self):
        print('Dog is running...')

class Cat(Animal):

    def run(self):
        print('Cat is running...')

注意产生变量的类型以及多态:

 

 

 

多继承

 

4.方法重写 

 

 

posted @ 2020-02-04 14:06  德狗咬不过狗  阅读(202)  评论(0编辑  收藏  举报