Python基础 -- Task10. 类与对象

1.1类的定义格式
python使用关键字class 定义类,并在类中定义属性(数据成员)和方法(成员函数),格式如如下:

class<类名>:
    <属性定义>
    <方法定义>

其中class为关键字,类名的首字母通常为大写字母。

class Person:
    def __init__(self, name, gender,age):
        self.name= name
        self.gender= gender
        self.age= age
    def display(self):
        print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)

1.2对象的创立
对象是类的实例,对象的创建过程也是类的实例化过程。创建对象和调用函数类似,如果构造函数__init__()声明有参数,则还需要传入相应的参数;同时,创建对象后还要把他赋给一个变量,使该变量指向对象,否则将无法引用所创建的对象。

class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age) 

执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20

1.3属性的添加修改和删除
属性的添加:

# author:answer   time:2019/11/2
class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
    def displayPerson(self):
        print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
stu1.score=90                    #添加属性score
stu2.score=80                    #添加属性score
stu1.displayPerson()
print("The score of stu1 is:",stu1.score)
stu2.displayPerson()
print("The score of stu2 is:",stu2.score)

执行结果:
Name: LiMing Gender: M Age: 19
The score of stu1 is: 90
Name: LiMing Gender: M Age: 19
The score of stu2 is: 80

添加或创建属性时,也可以使用setattr()函数;上述属性添加也可改写成:

setattr(stu1,'score',90)
setattr(stu2,'score',80)

属性的修改:

# author:answer   time:2019/11/2
class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
    def displayPerson(self):
        print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu1.age=21       #属性的修改
stu1.displayPerson()

执行结果:
Name: LiMing Gender: M Age: 21

属性的删除:

# author:answer   time:2019/11/2
class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
    def displayPerson(self):
        print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu1.score=90
stu1.displayPerson()
print("The score of stu1 is:",stu1.score)
del stu1.score                 #删除属性
print(hasattr(stu1,'score'))   #判断stu1是否含有score属性

执行结果
Name: LiMing Gender: M Age: 19
The score of stu1 is: 90
False

2.1类属性和对象属性
根据所属的对象,python的属性分为类属性和对象属性(也称实例属性)两种。

  • 类属性是在类中方法外定义的属性,既可以通过类名访问,也可以通过对象名访问
  • 对象属性只为单独的特定对象拥有,可以在类外显示定义,也可以在类的构造函数__int__()中定义,定义时以self作为前缀,且只能通过对象名访问。
# author:answer   time:2019/11/2
class Person:
    number=0                               #类属性
    def __init__(self,name,gender,age):    #初始化对象属性
        self.name=name
        self.gender=gender
        self.age=age
        Person.number+=1
stu1=Person("LiMing","M",19)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
stu1.score=90                             #对象属性在类外定义
print("The score of stu1:",stu1.score)
print(stu1.number) 
print(Person.number)

执行结果:
Name: LiMing Gender: M Age: 19
The score of stu1: 90
1
1
# author:answer   time:2019/11/2
class Person:
    number=0                                
    def __init__(self,name,gender,age):     
        self.name=name
        self.gender=gender
        self.age=age
        Person.number+=1
stu1=Person("LiMing","M",19)
print(Person.name)

执行结果:(执行出错)
Traceback (most recent call last):
  File "C:/Users/answer/PycharmProjects/leiheduixiang/ppp.py", line 10, in <module>
    print(Person.name)
AttributeError: type object 'Person' has no attribute 'name'

对象属性只能通过对象名访问,而不能通过类名访问,因此在执行print(Person.name)时出错

2.2公有属性和私有属性
python的公有属性和私有属性通过属性命名方式区分,如果属性名以两个下划线开头,则说明是私有属性,否则是公有属性。私有属性的访问通过如下形式进行:
类的私有属性实例:

<(对象)>.<_类名__私有属性>
class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0  # 公开变量

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)


counter = JustCounter()
counter.count()  # 1
counter.count()  # 2
print(counter.publicCount)  # 2

print(counter._JustCounter__secretCount)  # 2 Python的私有为伪私有
print(counter.__secretCount)  
# AttributeError: 'JustCounter' object has no attribute '__secretCount'

类的私有方法实例:

class Site:
    def __init__(self, name, url):
        self.name = name  # public
        self.__url = url  # private

    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)

    def __foo(self):  # 私有方法
        print('这是私有方法')

    def foo(self):  # 公共方法
        print('这是公共方法')
        self.__foo()


x = Site('老马的程序人生', 'https://blog.csdn.net/LSGO_MYP')
x.who()
# name  :  老马的程序人生
# url :  https://blog.csdn.net/LSGO_MYP

x.foo()
# 这是公共方法
# 这是私有方法

x.__foo()
# AttributeError: 'Site' object has no attribute '__foo'

3.内置方法
常用的内置方法:
在这里插入图片描述
例:init( )方法:

    __init__( )方法是python类的一种特殊方法,也称构造函数,当创建对象时系统自动调用,
    用来为对象分配内存并且为属性进行初始化。
# author:answer   time:2019/11/2
class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age)

执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20

例:del( )方法:

__del__( )方法也称析构函数,用来解释对象占用的存储空间,在python删除对象和收回对象
储存空间时被自动调用和执行。如果用户没有编写析构函数,则python将提供一个默认的
析构函数。
# author:answer   time:2019/10/17
#析构函数
class Person:
    def __init__(self,name,gender,age):
        self.name=name
        self.gender=gender
        self.age=age
    def __del__(self):
        print("调用析构函数:",self.name,self.gender,self.age)
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age)
del stu1
del stu2

执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20
调用析构函数: LiMing M 19
调用析构函数: ZhangLi F 20

4.1继承和派生

  • 继承:子类自动共享父类之间数据和方法的机制
    派生类的定义格式:
class<派生类名>(<基类名>):
    def __init__(self[,<参数>])<基类类名>.__init__(self[,<参数>])
    	<新增属性定义>
# author:answer   time:2019/10/19
#派生类
class Person:
    def __init__(self, name, gender,age):
        self.name= name
        self.gender= gender
        self.age= age
    def display(self):
        print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)
class Student (Person) :
    def __init__(self, num, major,name,gender,age):
        Person.__init__(self,name,gender,age)
        self.num= num
        self.major= major
    def displayStudent (self) :
        print('Number:',self.num, 'Major:',self .major)
        Person.display(self)
stu1= Student('201710000201','数理','answer9523',"男",19)
stu2= Student('201610050', '软件工程','刘小天','男',20)
stu1. displayStudent()
stu2.displayStudent ()

执行结果:
Number: 201710000201 Major: 数理
Name: answer9523 Gender: 男  Age:  19
Number: 201610050 Major: 软件工程
Name: 刘小天 Gender: 男  Age:  20
  • super函数 的使用
 super().__init()__
# author:answer   time:2019/10/19
#派生类
class Person:
    def __init__(self, name, gender,age):
        self.name= name
        self.gender= gender
        self.age= age
    def display(self):
        print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)
class Student (Person) :
    def __init__(self, num, major,name,gender,age):
        super(Student,self).__init__(name,gender,age)
        self.num= num
        self.major= major
    def displayStudent (self) :
        print('Number:',self.num, 'Major:',self .major)
        super(Student,self).display()
stu1= Student('201710000201','数理','answer9523',"男",19)
stu2= Student('201610050', '软件工程','刘小天','男',20)
stu1. displayStudent()
stu2.displayStudent ()

4.2多继承
Python 虽然支持多继承的形式,但我们一般不使用多继承,因为容易引起混乱。

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法。

# author:answer   time:2019/10/19
#多继承
class Student:                                             #基类Student
    def __init__(self,num,name,gender):
        self.num=num
        self.name=name
        self.gender=gender
    def displayStudent(self):
        print('学号:%s,姓名:%s,性别:%s'%(self.num,self.name,self.gender))
class Teacher:                                             #基类Teacher
    def __init__(self,title,major,subject):
        self.title=title
        self.major=major
        self.subject=subject
    def displayTeacher(self):
        print('职称:%s,专业:%s,课程:%s'%(self.title,self.major,self.subject))
class Assistant(Student,Teacher):                          #派生类Assistant
    def __init__(self,num,name,gender,title,major,subject,salary):
        Student.__init__(self,num,name,gender)
        Teacher.__init__(self,title,major,subject)
        self.salary=salary
    def displayAssistant(self):
        super(Assistant,self).displayStudent()
        Teacher.displayTeacher(self)
        print("薪水:",self.salary)
ta=Assistant("201710000201","answer","男","助教","数理","信息","10000")
ta.displayAssistant()

执行结果:
学号:201710000201,姓名:answer,性别:男
职称:助教,专业:数理,课程:信息
薪水: 10000

5.1 方法的重载

方法重载就是在派生类中使用与基类完全相同的方法名,从而重载基类的方法。
# author:answer   time:2019/10/19
#方法重载
class Animal:
    def display(self):
        print("I am a animal!")
class Dog(Animal):
    def display(self):
        print("I am a dog!")
class Cat(Animal):
    def display(self):
        print("I am a cat!")
class Wolf(Animal):
    def display(self):
        print("I am a wolf")
x=[item() for item in (Animal,Dog,Cat,Wolf)]
for item in x:
    item.display()
    
执行结果:
I am a animal!
I am a dog!
I am a cat!
I am a wolf

5.2 运算符重载
什么是运算符重载

让自定义的类生成的对象(实例)能够使用运算符进行操作

作用:

 让自定义的实例像内建对象一样进行运算符操作
 让程序简洁易读
 对自定义对象将运算符赋予新的规则

在这里插入图片描述

# author:answer   time:2019/10/19
# 运算符重载
class Number:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def __add__(self, x):
        return Number(self.a+x.a,self.b+x.b)
    def __sub__(self, x):
        return  Number(self.a-x.a,self.b-x.b)
n1=Number(10,20)
n2=Number(100,200)
m=n1+n2
p=n2-n1
print(m.a,m.b)
print(p.a,p.b)

执行结果:
110 220
90 180

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值