搞懂Python类、方法、变量、实例化和对象的概念
类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
属性:类中的所有变量称为属性。
方法:类中定义的函数。不过,和函数所有不同的是,类方法至少要包含一个 self 参数。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。
实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
局部变量:定义在方法中的变量,只作用于当前实例的类。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
方法重载:类中支持多个同名函数,但参数的个数或类型要不同,在调用的时候,解释器会根据参数的个数或者类型,调用相应的函数.
封装:将类的某些部分(属性、方法)隐藏起来,具有一定的保护作用,隐藏对象的属性和方法实现细节,仅对外提供公共的访问方式。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
多态:多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承).
实例化:创建一个类的实例,类的具体对象。
class 类名:
执行语句
类变量
类方法
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
类最重要的两部分就是类变量和类方法,类成员之间的可以相互调用。
class Animal():
# __init__用于在创建对象时进行初始化操作,通过这个方法可以绑定name和color两个属性
def __init__( self, name, color):
self.name = name
self.color = color
def play( self, action):
print('%s正在玩%s.' % (self.name, action))
animal = Animal("dog","black")
animal.play("篮球")
dog正在玩篮球.
def __init__(self):
self.data = []
animal = Animal("dog","black")
class Animal:
def show( self):
print(self)
print(self.__class__)
animal = Animal()
animal.show()
<__main__.Animal instance at 0x10ad9d638>
__main__.Animal
class Animal():
def show( lidihuo):
print(lidihuo)
print(lidihuo.__class__)
animal = Animal()
animal.show()
<__main__.Animal instance at 0x10ad9d638>
__main__.Animal
class Animal:
# __init__用于在创建对象时进行初始化操作,通过这个方法可以绑定name和color两个属性
def __init__( self, name, color):
self.name = name
self.color = color
def __play( self, action):
print('%s正在玩%s.' % (self.name, action))
def main():
animal = Animal("dog","black")
animal.__play("篮球")
if __name__ == "__main__":
main()
Traceback (most recent call last):
File "script.py", line 14, in
main()
File "script.py", line 12, in main
animal.__play("篮球")
AttributeError: 'Animal' object has no attribute '__play'
class Animal:
def __init__( self, name, color):
self.name = name
self.color = color
# 访问器 - getter方法
@property
def name( self):
return self._name
# 访问器 - getter方法
@property
def color( self):
return self._color
# 修改器 - setter方法
@name.setter
def name( self, name):
self._name = name
# 修改器 - setter方法
@color.setter
def color( self, color):
self._color = color
def play( self, action):
print('%s正在玩%s.' % (self.name, action))
def main():
animal = Animal("dog","black")
animal.play("篮球")
if __name__ == "__main__":
main()
dog正在玩篮球.
class Animal:
# 限定Person对象只能绑定_name, _color和_age属性
__slots__ = ('_name', '_color', '_age')
def __init__( self, name, color):
self.name = name
self.color = color
# 访问器 - getter方法
@property
def name( self):
return self._name
# 访问器 - getter方法
@property
def color( self):
return self._color
# 修改器 - setter方法
@name.setter
def name( self, name):
self._name = name
# 修改器 - setter方法
@color.setter
def color( self, color):
self._color = color
def play( self, action):
print('%s正在玩%s.' % (self.name, action))
def main():
animal = Animal("dog","black")
animal.play("篮球")
animal._age = (5)
animal._weight = (50)
if __name__ == "__main__":
main()
animal._weight = (50)
AttributeError: 'Animal' object has no attribute '_weight'
@staticmethod,静态方法,通过类直接调用,不需要创建对象,不会隐式传递self
@classmethod,类方法,方法中的self是类本身,调用方法时传的值也必须是类的公有属性,就是说类方法只能操作类本身的公有字段。
class Animal:
name = "Dog"
color = "Black"
@classmethod
def play( self, action):
print('%s正在玩%s.' % (self.name, action))
@staticmethod
def show():
print('%s是%s的.' % (Animal.name,Animal.color))
def main():
animal = Animal()
animal.play("篮球")
Animal.show()
if __name__ == "__main__":
main()
Dog正在玩篮球.
Dog是Black的.