1.类和对像引言
类: 是一类事物的抽像概念(模型),不是真的存在的。用来描绘该类事物共同的特征和行为。
例如: 船模型,车模型,飞机模型
作用:用来封装一类事物的共同特征(属性)和行为(方法,函数)
类属性: 这个类事物的共同特征(这个类的每个对像都有这个属性,而且属性值是一样的)
类属性的定义:直接定义在类里面的变量
比如:猫类的共同特征: 四条腿,长尾巴,两只眼情
实例对像: 某类事物的具体个体,是该类事物的具体表现,是真实存在的。
例如:泰坦尼克号 就是一艘具体的船
2.类的定义
1.关键字: class
语法:
方式1: class 类名:
方式2: class 类名(object):
说明:方式1和方式2定义类都是一样的,没有任何区别,只是写法不一样
python里的class定义类为什么括号有object?
你可以把object理解为⼀个很⼤的类,然后加括号表⽰继承object⾥
2.定义类属性:
代码示例:
class Cat(object):
leg = "四条腿"
tail = "长尾巴"
3.对像属性(实例属性):这一类事物都可能会有这个属性,属性值有可能不一样
对像属性的定义:
方式1 :通过对像进行赋值
方式2 : 通过初化方法__init__进行定义
通过类创建出来的,拥有这个类所有的特征和行为
4.通过类创建对像: obj = 类名()
代码示例:
c1 = Cat()
c2 = Cat()
5.类属性的访问
1.类可以直接访问类属性
2.该类的实例对像也可以访问类属性
self :代表对像本身
class Cat:
attr1 = "喵"
attr2 = "有毛"
attr3 = "爱吃鱼"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def skill1(self):
print("抓老鼠")
def skill2(self):
print("爬树")
c1 = Cat("叮当猫",6,"公")
c1.attr1
c1.small_name = '小花猫'
print(c1.small_name)
3.公有属性、_私有属性、__私有属性
通过下面的代码,可以看到:
1.公有属性,通过对象和类都可以访问。
2.单下划线私有属性也可通过对象和类访问(尽量不用,修好改删除容易出问题)。
3.双下划线私有属性在类外面不能访问。
class TestClass:
attr = 100
_attr = 10
__attr = 20
def func(self):
print(self._attr)
print(self.__attr)
t1 = TestClass()
print(t1.attr)
print(TestClass.attr)
print(t1._attr)
print(TestClass._attr)
print(t1.__attr)
print(TestClass.__attr)
4.类方法、静态方法、对象方法。
1.对象方法(也叫实例方法):
通过对象去调用的: 对象.方法名(); 不能通过类去访问
通过下面这段代码,可以发现对象可以调用类方法,而类不能直接访问对象方法
代码示例:
class TestClass:
def func(self):
print("方法测试")
t1 = TestClass()
t1.func()
TestClass.func()
2.类方法:
定义:使用装饰器 @ classmethod,第一个参数必表面是当前类对象,该参数名一般约定为"cls", 通过他来传递类的属性和方法(不能传实例的属性和方法)。
如果方法以类为主体去调用,方法内部不会涉及到对象属性或对象方法的使用,那么该方法就定义为类方法。
代码示例:
class TestClass:
@classmethod
def func2(cls):
print("这个是类方法:classmethod 之方法之一"),
t1 = TestClass()
t1.func2()
TestClass.func2()
3.静态方法
定义: 使用装饰器 @ staticmethod,参数随意,没有self和cls参
应用场景: 方法内部不会使用类属性和类方法,也不会涉及到对象属性和对象方法
class TestClass:
@staticmethod
def func3():
print("这是一个静态方法")
思考:三种方法的应用场景(在什么情况下用对象方法,什么情况下用类方法,什么情况下用静态方法)?