py面向对象
1.定义:
python
class Person():
# 构造方法,初始化对象,(表示属性装配),初始化调用方法
def __init__(self,name,):
# self 表示类的实例本身
self.attribute1 = parameter1 # 实例属性1
self.attribute2 = parameter2 # 实例属性2
self.name = name
def name_method(self)
print(f"Hello, I'm {self.name}")
p = Person("Alice")
p.greet() # 调用时无需传递 self,输出:Hello, I'm Alice
2.其他用法:
(1).类方法(用 @classmethod
装饰)
第一个参数必须是 cls
(约定名称),指代当前类本身,而非实例。调用时不需要手动传递 cls
python
class Person:
species = "Human" # 类属性,相当于上面定义了一个self.species,所以不用__init__
# 类方法:第一个参数是 cls @classmethod
def show_species(cls):
print(f"This is a {cls.species}")
Person.show_species() # 直接通过类调用,输出:This is a Human
(2).静态方法(用 @staticmethod
装饰)
不需要特殊参数(既不用 self
也不用 cls
),更像一个普通函数,只是定义在类的命名空间里。
python
class Calculator:
# 静态方法:无特殊参数
@staticmethod
def add(a, b):
return a + b
# 可以通过类或实例调用
print(Calculator.add(2, 3)) # 输出:5
其他参数
一~类的私有性:
python
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
1.类外部直接访问时受限
私有属性的主要作用就是限制在类的外部直接访问
python
class MyClass:
def __init__(self):
self.__private = "我是私有属性" # 私有实例属性
obj = MyClass()
print(obj.__private) # 报错:AttributeError: 'MyClass' object has no attribute '__private'
2.子类中不能直接访问父类的私有属性
父类的私有属性会被 "隐藏",子类无法直接通过属性名访问,即使子类继承了父类也不行。
python
class Parent:
def __init__(self):
self.__private = "父类私有属性"
class Child(Parent):
def get_parent_private(self):
return self.__private # 报错:无法直接访问父类的私有属性
child = Child()
child.get_parent_private() # AttributeError: 'Child' object has no attribute '__private'
二~父类(基类)和子类(派生类)
基本语法:
python
# 定义父类(基类)
class ParentClass:
# 父类的属性和方法
pass
# 定义子类(派生类),继承自父类
class ChildClass(ParentClass):
# 子类的属性和方法(可以继承父类的,也可以新增或重写)
pass
示例 1:简单的父类和子类
父类有分支子类; 这些分支子类有重写,继承(多层继承:子类可以继承自 "子类的子类";多继承:一个子类可以同时继承多个父类(用逗号分隔))等功能。
python
# 父类:动物
class Animal:
# 类属性
category = "生物"
# 初始化方法
def __init__(self, name):
self.name = name # 实例属性
# 父类的方法
def eat(self):
print(f"{self.name} 在吃东西")
# 子类:狗(继承自动物)
class Dog(Animal):
# 子类新增的方法
def bark(self):
print(f"{self.name} 在汪汪叫")
# 子类:猫(继承自动物)
class Cat(Animal):
# 子类重写父类的方法
def eat(self):
print(f"{self.name} 优雅地吃着猫粮")
# 子类新增的方法
def meow(self):
print(f"{self.name} 在喵喵叫")
# 使用子类
dog = Dog("旺财")
dog.eat() # 继承父类的方法:旺财 在吃东西
dog.bark() # 子类自己的方法:旺财 在汪汪叫
cat = Cat("咪宝")
cat.eat() # 重写后的方法:咪宝 优雅地吃着猫粮
cat.meow() # 子类自己的方法:咪宝 在喵喵叫
# 访问父类的类属性
print(dog.category) # 生物(子类继承了父类的类属性)
示例 2:多层继承和多继承
python
# 祖父类
class GrandParent:
def grand_method(self):
print("这是祖父类的方法")
# 父类(继承自祖父类)
class Parent(GrandParent):
def parent_method(self):
print("这是父类的方法")
# 子类(继承自父类,同时继承祖父类的方法)
class Child(Parent):
def child_method(self):
print("这是子类的方法")
# 多继承示例(同时继承两个父类)
class Father:
def father_say(self):
print("我是父亲")
class Mother:
def mother_say(self):
print("我是母亲")
class Child(Father, Mother):
pass # 继承两个父类的所有方法
child = Child()
child.father_say() # 我是父亲
child.mother_say() # 我是母亲
pass
是一个空语句,它的核心作用是 “占位”—— 表示 “这里需要有代码,但暂时什么都不做
类的专有方法:
- init : 构造函数,在生成对象时调用
- del : 析构函数,释放对象时使用
- repr : 打印,转换
- setitem : 按照索引赋值
- getitem: 按照索引获取值
- len: 获得长度
- cmp: 比较运算
- call: 函数调用
- add: 加运算
- sub: 减运算
- mul: 乘运算
- truediv: 除运算
- mod: 求余运算
- pow: 乘方
- str: print()时返回字符串
重载
”重载” 指的是为同一个个运算符(如 +
、-
、*
等)定义不同的行为,使其能适用于不同类型的对象
python
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
其中,__add__
方法就是对 +
运算符的重载