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条
posted @   牛鱼针  阅读(319)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示