python学习第六天----面向对象

1.创建一个类:

class Student():
    name = ''
    age = 0

    def print_file(self):
        print('name: ' + self.name)
        print('age: ' + str(self.age))


#实例化
student = Student()
student.print_file()
#name:
#age: 0
  1. 类中函数的定义必须有self形参。这个形参指向这个类
  2. 调用类中的变量需要通过self去调用

 类的定义:

  类是现实世界或思维世界中的实体在计算机中的反映。它将数据以及这些数据上的操作封装在一起。
  实例化: 就是讲零件(参数)放到这个类的工厂中,加工出来的不同的对象。
 

2.构造函数:(__init__)

class Student():
    name = ''
    age = 0

    def __init__(self):
        # 构造函数
        print('student')

    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student()
# student
  1. 构造函数的调用是在实例化时自动执行的。我们也可以显式的去调用。
student1.__init__();
  构造函数与普通函数的区别:构造函数返回为None,而且,自定义返回值时也只能是None
class Student():
    name = ''
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age



    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')
print(student1.name)
print(student1.age)

  在构造方法中可以初始化对象的一些静态变量。

类变量与实例变量:

  类变量指的是定义类的时候,类里边定义的变量。如name和age。
 

  self不是关键字,可以命名为其他的名字(标识符),但是python建议我们使用self。
  self是和对象实例相关联的,可以调用实例方法。
 
  

探究类 与对象的变量查找顺序

class Student():
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        name = name
        age = age



    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')
print(student1.name)
#qiyue
  此时打印student1对象字典:
print(student1.__dict__)
#{}
  修改:
class Student():
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age



    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')
# print(student1.name)
print(student1.__dict__)
#{'name': '孙悟空', 'age': '1000'}
  
  对对象内的属性查找顺序----如果有实例变量,就获取实例变量,如果没有实例变量,就获取类变量。
class Student():
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age



    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')
print(student1.name)
print(Student.name)
print(student1.__dict__)
print(Student.__dict__)
结果如下:
孙悟空
qiyue
{'name': '孙悟空', 'age': '1000'}
{'__module__': '__main__', 'name': 'qiyue', 'age': 0, '__init__': <function Student.__init__ at 0x000002326DF3A0D0>, 'do_homework': <function Student.do_homework at 0x000002326DF3A160>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

在实例中访问实例变量和类变量:

class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age
        print(Student.sum)
        print(self.sum)
        print(self.__class__.sum)


    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')

#结果是
# 0
# 0
# 0
 
修改类变量。
class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age
        self.__class__.sum += 1
        print('当前班级总数为' + str(self.__class__.sum))


    #行为与特征
    def do_homework(self):
        print('homework')

student1 = Student('孙悟空', '1000')
student2 = Student('李哪吒', '1000')
student2 = Student('姜尚', '1000')
student2 = Student('姬发', '1000')
student2 = Student('九尾狐', '1000')
student2 = Student('子受', '1000')
#打印结果:
#当前班级总数为1
#当前班级总数为2
#当前班级总数为3
#当前班级总数为4
#当前班级总数为5
#当前班级总数为6

类方法:

class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age
        self.__class__.sum += 1
        print('当前班级总数为' + str(self.__class__.sum))


    #行为与特征
    #实例方法
    def do_homework(self):
        print('homework')
    

    #类方法 --- 装饰器,需要一个特定的指向,等同实例方法的self,但是python建议使用cls
    @classmethod
    def plus_sum(cls):
        cls.sum += 1
        print(cls.sum)

student1 = Student('石敢当', 18)
Student.plus_sum()
student1 = Student('孙悟空', 18)
Student.plus_sum()
student1 = Student('贾宝玉脖子上的石头', 18)
Student.plus_sum()
打印结果:
当前班级总数为1
2
当前班级总数为3
4
当前班级总数为5
6
python允许对象调用类的方法。
 
 

静态方法:

  静态方法与类方法和实例方法的不同:
    ⑴ 静态方法不必强制传入self或者cls(self指的是实例本身,cls指的是类本身)
 
class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        # 构造函数
        # 初始化对象的特征
        self.name = name
        self.age = age

    #行为与特征
    #实例方法
    def do_homework(self):
        print('homework')
    

    #类方法 --- 装饰器,需要一个特定的指向
    @classmethod
    def plus_sum(cls):
        cls.sum += 1
        print(cls.sum)

    #静态方法
    @staticmethod
    def add(x, y):
        print(Student.sum)
        print('This is a static method')

student1 = Student('石敢当', 18)
Student.add(1, 2)
student1.add(2,3)
  打印结果:
0
This is a static method
0
This is a static method
  说明由类或者实例都可以调用静态方法。

成员可见性:公开和私有

  如果给方法名或变量名前加上双下划线,而方法名或或变量名后面没有双下划綫,python则认为这个方法为私有的。同时应极力避免在方法名后加双下划线,以分开python内置方法和自定义方法
class Student():
    
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.score = 0


    def __marking(self, score):
        self.score = score
        print(self.name + '同学本次考试分数为' + str(self.score))


student1 = Student('石敢当', 18)
student1.__marking(59)
结果是:
Traceback (most recent call last):
  File "c2.py", line 41, in <module>
    student1.__marking(59)
AttributeError: 'Student' object has no attribute '__marking'
  在类以外,可以通过类名.方法来执行所有的类里边的所有的非私有方法。
 
  注意点:
class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):

        self.name = name
        self.age = age
        self.__score = 0

    def ___marking(self, score):
        self.__score = score
        print(self.name + '同学本次考试分数为' + str(self.score))
        
    #静态方法
    @staticmethod
    def add(x, y):
        print(Student.sum)
        print('This is a static method')

student1 = Student('石敢当', 18)
print(student1.__score)
  打印结果:
Traceback (most recent call last):
  File "c2.py", line 41, in <module>
    print(student1.__score)
AttributeError: 'Student' object has no attribute '__score'
 
  此时是访问不到的,但是赋值呢?修改最后一句代码:
student1.__score = -1
print(student1.__score)
  打印结果是:-1
  那么,此时是私有变量被修改为共有变量了么?
class Student():
   
    sum = 0
    name = 'qiyue'
    age = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__score = 0

    def marking(self, score):
        self.__score = score
        print(self.name + '同学本次考试分数为' + str(self.__score))

    def getScore(self) :
        print(self.__score)

   
student1 = Student('石敢当', 18)
student1.marking(50)
student1.__score = -1
print(student1.__score)
student1.getScore()
print(student1.__dict__)
  结果是:
石敢当同学本次考试分数为50
-1
50
{'name': '石敢当', 'age': 18, '_Student__score': 50, '__score': -1}
  由此可见,私有变量__score被被替换为名_Student__score的共有变量,且可以通过实例方法中的self.__score获取到。

继承:

  c4.py中的内容:
class Human():

    sum = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        print(self.name)
  
  c3.py中的内容:
from c4 import Human

class Student(Human):

    def do_homework(self):
        print('english homework')

student1 = Student("曹雪芹", 220)
print(student1.sum)
print(Student.sum)
print(student1.name)
print(student1.age)
student1.get_name()    
  
  Student被称为Human的子类,Human也就是Student的父类。
  运行c3的结果是:
 
0
0
曹雪芹
220
曹雪芹
  可以看出,方法和变量皆被继承。
  python是允许多继承的。
  对于继承时变量如何传递?修改c3
 
from c4 import Human

class Student(Human):

    def __init__(self, school, name, age):
        self.school = school
        Human.__init__(self,name, age)

    def do_homework(self):
        print('english homework')

student1 = Student("没有", "曹雪芹", 220)
print(student1.name)
print(student1.age)
student1.get_name()
打印结果:
曹雪芹
220
曹雪芹

关键字: super

  它是代表父类的关键字。当父类的方法名与子类的方法名相同时,通过实体类点出来的方法是子类的。此时,可以通过super来调用父类的同名方法。代码验证如下:
  c4中在Human类下增加do_homework方法:
 
 def do_homework(self):
        print("this is parent method")
  修改c3:
from c4 import Human

class Student(Human):

    def __init__(self, school, name, age):
        self.school = school
        # Human.__init__(self,name, age)
        super(Student, self).__init__(name, age)

    def do_homework(self):
        super(Student, self).do_homework()
        print('english homework')

student1 = Student("没有", "曹雪芹", 220)
student1.do_homework()

打印的结果是:

this is parent method
english homework

原文地址:https://www.cnblogs.com/dsweb/p/14084916.html