0%

第四周-面向对象

定义一个类

1
2
3
4
class Person(object):	#objectobject 是所有类的基类,也称为顶级类或根类。在定义类时,如果没有明确指定继承的父类,则默认继承自 object 类,可以省略
def eat(self): # self 是一个惯用的命名约定,用来表示对象自身。在类的方法定义中,self 参数指向类的实例,也就是调用该方法的对象本身。通过 self,可以在方法内部访问和操作对象的属性和方法。是 Python 中定义类方法的标准做法,不可省略
''''''
def jump(self):

类中几种常见方法

__init__方法(类似与java类的构造函数)

del()方法:删除对象时自动调用,在对一个对象引用次数为0才算彻底删除

举个例子

定义一个动物的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal(object):
#定义初始化方法 创建对象时候自动调用
def __init__(self,name):
# print('__init__方法被调用')
self.name = name

#定义普通方法
def walk(self):
print('动物会跑')

#定义一个析构方法 删除对象的时候自动调用
def __del__(self):
# print('__del__方法被调用')
print('%s对象被干掉'%(self.name))

然后实例化一个猫的对象,并且多次引用

1
2
3
cat = Animal('波斯猫')
cat2 = cat
cat3 = cat

发现创建了多个cat对象

如果只删除一个,另外两个还存在

魔法方法:Python中的一种特殊方法,它们以双下划线开头和结尾,例如 __init____str____add__ 等。这些方法在特定的情况下会被Python解释器自动调用,而不需要我们显式地调用它们。

举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#定义一个车类
class Car(object):
#定义初始化方法 创建对象的时候被自动调用
def __init__(self,newColor,newWheelNum):
self.color = newColor
self.wheelNum = newWheelNum

#定义一个析构方法 删除对象的时候被自动调用
def __del__(self):
print('%s对象被删除'%(self.color))

#定义一个魔方方法
def __str__(self):
# msg = '%s-%d'%(self.color,self.wheelNum)
# return msg
return self.color

#创建一个对象laosi
laosi = Car('红色',4)
# 通过print打印对象的时候,如果类中定义__str__方法,自动调用,一般方便查看类中属性值
print(laosi)
# 后面做开发的时候,想直接返回对象中属性值

#总结:如果类的属性比较多,可以重写__str__()方法打印属性,方便阅读,无需手动调用,当使用print打印对象的时候,自动调用

定义一个魔法方法

1
2
def __str__(self):
return self.color

如果类的属性比较多,可以重写__str__()方法打印属性,方便阅读,无需手动调用,当使用print打印对象的时候,自动调用

1
2
3
def __str__(self):
msg = '%s-%d'%(self.color,self.wheelNum)
return msg

str()和repr()

_str_()用于将数值转化为人阅读的形式,调用print的时候自动调用

__repr__()用于转化为解释器读取的形式

注:在没有__str__的时候,认为str == repr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import datetime

#获取当前的时间
now = datetime.datetime.now()
print(now)
# output 2024-02-05 22:12:48.663497
print(type(now))
# output <class 'datetime.datetime'>
print(str(now)) #转换成字符串
# output: 2024-02-05 22:12:48.663497
print(type(str(now)))
# output: <class 'str'>
print(repr(now))
# output: datetime.datetime(2024, 2, 5, 22, 12, 48, 663497)
print(eval(repr(now))) #eval参数是字符串表达式 repr(now)当成整体作为参数执行 再返回repr之后的结果
# output: 2024-02-05 22:12:48.663497

总结: repr返回的是字符串,一般用来获取对象

obj == eval(repr(obj)) 这个公式是成立的

继承

定义

1
2
3
4
5
class A(object):
attribute1, attribute2
def method1(self):
def method2(self):
class B(A): # 表示B继承A

如果有两个类,一个父类,一个子类,定义了同名的方法,如果实例化子类对象调用方法的时候先从子类查找 ,再一级一级往上查找

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Person(object):
#定义初始化方法
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex

#定义普通方法
def eat(self):
print('人都需要吃饭')

#定义普通方法
def speak(self):
print('我会汉语')


#定义子类Student继承父类Person
class Student(Person):
#定义初始化方法
def __init__(self,no,name,age,sex):
self.no = no
# 调用父类同名方法
# 1.父类类名.父类方法
# Person.__init__(self,name,age,sex) 直接调用父类的初始化方法,并将 self(当前实例)以及需要传递的参数传递给它。
# 2.super()
# super().__init__(name,age,sex) 使用 super() 函数获取父类的引用,并调用其初始化方法,无需手动传递 self,它会自动传递。
super(Student, self).__init__(name,age,sex)
# 调用父类 Person 的 __init__ 方法,以便在创建 Student 对象时对父类属性进行初始化。

访问限制

私有,就是按java中私有属性的来理解

__双下划线后面跟属性名

举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Person(object):
#定义一个初始化方法
def __init__(self,name,money):
self.__name = name
self._money = money

#定义普通方法对属性设置
def setName(self,value):
#数据过滤
if len(value) <= 4:
self.__name = value
else:
print('名称的长度不能大于4个字符')
#定义普通方法获取属性值
def getName(self):
return self.__name

#定义私有方法
def __sayHello(self):
print('我的名字是:%s,我有%s存款'%(self.__name,self._money))

#定义公有方法获取私有属性
def test(self):
self.__sayHello()

半公开:_单下划线后面跟属性名

公开:直接属性名