python类与对象
python类与对象
python通过类来创建对象,对象是类的实例。
1.类的定义
类通过class + 类名的方式定义
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
类名的首字母一般用大写,类中的函数称为方法。
2.Class对象
类的对象支持两种操作:属性引用和实例化
(1)属性引用
如上述代码通过Myclass.i或Myclass.f即可返回一个整数和一个函数,并且可以通过复制Myclass.i来改变他的值。
print(MyClass.i)
MyClass.i = 10
print(MyClass.i)
print(type(MyClass.f)
#12345
#10
#<class 'function'>)
(2)实例化
x = Myclass()
这里的x便是类的实例。
3.__init__方法
这是一个特殊的方法,当实例化类时会自动调用该方法。
许多类喜欢创建带有特定初始状态的自定义实例。 为此类定义可能包含这个方法,就像这样:
class Jump:
def __init__(self,name):
self.name = name
def jump(self):
print(f'{self.name} is jumping now!')
a = Jump("小a")
a.jump()
#小a is jumping now!
当创建一个实例时这个方法自动使self.name赋值为"小a"。
如果没有这个方法,那上面的例子就应当这么写:
class Jump:
def name(self,name):
self.name=name
def jump(self):
print(f'{self.name} is jumping now!')
a = Jump()
a.name("小a")
a.jump()
#小a is jumping now!
我们还要再调用一次name的方法。
4.实例对象
实例对象能理解的唯一操作是属性引用,有两种有效的属性名称:数据引用和方法
(1)数据引用
实例可以引用类中的数据
class MyClass:
i = 12345
def f(self):
return 'hello world'
a = MyClass()
print(a.i)
#12345
但是运用实例改变所引用的数据时,类原本的数据不会改变
a.i = 10
print(MyClass.i)
#12345
(2)方法
实例可以引用类中的方法
通常方法对象在绑定后直接被调用,但是也直接调用也不是必须的,我们可以将其保留起来。
class MyClass:
i = 12345
def f(self):
return 'hello world'
xf = x.f
while True:
print(xf())
将会一直输出,直到结束。
我们会发现这里上面调用 x.f()
时并没有带参数,虽然 f()
的函数定义指定了一个参数。实际上,方法的特殊之处就在于实例对象会作为函数的第一个参数被传入。
5.self
就像上面所说,类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self
。在调用方法时,我们无需明确提供与参数 self
相对应的参数。
简单来说self就是在未创建实例时,代替实例本身。
同时 self 在定义方法的时候必须有,调用方法的时候要忽略。因为调用方法时实例已经产生,应当使用创建的实例而非self。
6.共有和私有
python中定义私有变量只要在变量前加两个下划线"__".
class Sheep:
a = 10
__b = 11
def sb(self):
print(self.a)
print(self.__b)
x = Sheep()
x.sb()
print(x.a)
print(x.__b)
#10
#11
#10
#AttributeError: 'Sheep' object has no attribute '__b'
当我们调用方法时能够输出私有变量,而想在方法外引用就会报错,我们输出x.__b就会报错,表示实例没有这个变量。
私有方法同上,想调用私有方法,只能在公有方法中引用。
7.继承
(1)继承的定义
被继承的类称为父类,继承的类称为子类
子类会自动继承父类的方法和属性。
class Person(object): # 定义一个父类
a = 1
def talk(self): # 父类中的方法
print("person is talking....")
class Chinese(Person): # 定义一个子类,继承Person
def walk(self): # 在子类中定义其自身的方法
print('is walking...')
c = Chinese()
c.talk() # 调用继承的Person类的方法
c.walk() # 调用本身的方法
print(c.a)
# 输出
person is talking....
is walking...
1
(2)对子类方法的重构
如果子类中定义与父类同名的方法或属性,则会自动覆盖父类的该方法或属性
class Person(object): # 定义一个父类
def __init__(self):
print("is a person")
def talk(self): # 父类中的方法
print("person is talking....")
class Chinese(Person):
def __init__(self):
print("is a Chinese person")
def walk(self):
print('is walking...')
c = Chinese()
c.talk()
c.walk()
#is a Chinese person
#person is talking....
#is walking...
要想在父类的一个方法的基础上增加新功能,可以在同名方法下再次引用父类方法:
def __init__(self):
Person.__init__(self)
print("is a Chinese person")
#is a person
#is a Chinese person
#person is talking....
#is walking...
或者使用super()函数:
def __init__(self):
super().__init__()
print("is a Chinese person")
#is a person
#is a Chinese person
#person is talking....
#is walking...
(3)添加方法和属性
子类可以添加其他新方法和属性
添加属性:
class Person:
def __init__(self,name):
self.name = name
def information(self):
print(f"my name is {self.name}")
class Chinese(Person):
def __init__(self,name,language):
super().__init__(name)
self.language = language
def information(self):
print(f"my name is {self.name} and I speak {self.language}")
a = Chinese("小明","Chinese")
a.information()
#my name is 小明 and I speak Chinese
添加方法只要在子类中直接加入就可以了。
(4)判断是否为子类
运用issubclass()函数,有两个待填形参,前一个填子类,后一个填父类,类是自身的子类。
class A:
pass
class B(A):
pass
print(issubclass(B, A)) # True
print(issubclass(B, B)) # True
print(issubclass(A, B)) # False
print(issubclass(B, object)) # True
python中还支持多重继承,但是容易引起混乱所以一般不使用。
8.组合
类之间除继承外,还可以相互引用,进行组合,使在一个类中使用其他类。
class Turtle:
def __init__(self, x):
self.num = x
class Fish:
def __init__(self, x):
self.num = x
class Pool:
def __init__(self, x, y):
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print("水池里面有乌龟%s只,小鱼%s条" % (self.turtle.num, self.fish.num))
p = Pool(2, 3)
p.print_num()
# 水池里面有乌龟2只,小鱼3条
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现