Python面向对象基础知识
目录
类的定义
class Student():
name = ""
age = 0
def print_student(self):
print("name" + self.name)
(类中的函数必须传入self参数,对类中的属性的调用必须使用self。)(静态方法除外)
构造函数
- 初始化类的各种特征。
- 构造函数的执行是在类实例化时自动进行的。
- 构造函数也可以显式调用,但通常不这么做。
- (显示调用时返回的只能是None。)
class Student(): # 构造函数 def __init__(self): pass stu = Student() a = stu.__init__() # None
- (显示调用时返回的只能是None。)
- 使用构造函数来创建不同的对象。
def __init__(self, name, age):
self.name = name
self.age = age
# 实例化时必须传入相应的name和age。
stu = Student("Alice", 16)
类变量和实例变量
- 类变量
- 访问
class Student(): sum = 0 age = 0 name = "" # 访问: Student.name
- 类变量的使用方法
class Student(): count1 = 0 #(其它的实例方法中也可以操作) def __init__(self): #(每初始化一个学生类对象,学生数加一) self.__class__.count1 += 1 print("学生总数为:" + str(self.__class__.count1))
- 访问
- 实例变量
-
class Student(): # 类变量 name = "" def __init__(self, name): # 实例变量 self.name = name # 访问: stu = Student("Alice") stu.name stu.__dict__ # {"name":"Alice"}
-
class Student(): name = "" def __init__(self, name): name = name # "" # 会先找到类变量 stu1 = Student("Alice") stu1.__dict__ # 查看实例对象的所有变量,也可以查看类 # {}返回一个空字典
-
self和实例方法
-
def __init__(this, name): # self也可以使用其它名称
-
实例方法
-
class Student(): def __init__(self, name): # 实例方法中访问实例变量和类变量 self.name = name # 此处的name读取的是实例变量 print(self.name) # 此处的name读取的是形参name print(name) stu1 = Student("Alice") # "Alice" # "Alice" # (实例化对象时传过来的形参是"Alice")
class Student(): def __init__(self, name1): self.name = name1 # 此处的name读取的是实例变量 print(self.name) # 此处的name读取的是形参name print(name) stu2 = Student("Jack") # "Jack" # 报错,not defined(形参名为name1,所以形参名name找不到)
- 实例方法访问类变量
-
class Student(): count1 = 0 def __init__(self, name): self.name = name # 实例方法访问类变量第一种方式 print(Student.count1) # self.__class__指定当前类 # 实例方法访问类变量的第二种方式 print(self.__class__.count1)
-
-
类方法
-
通常用来操作类变量。
-
类方法访问不到实例变量,self找不到。
-
class Student(): sum1 = 0 # 通过装饰器构造类方法 @classmethod def plus_sum(cls): # 约定使用cls名称,其它也可以 cls.sum1 += 1 print(cls.sum1) # 通过类执行类方法 Student.plus_sum() # 可以通过对象来执行类方法,不会报错,但不建议这么做,逻辑不通 # 也可以正确的返回结果 stu1 = Student() stu1.plus_sum()
-
-
基本上和类方法没有区别,没有显式的定义类似于self,cls的形参变量。
-
访问不到实例变量,找不到self。
-
需要通过类名来访问类变量。
-
可以操作一些与类关联较弱的属性,不建议经常使用。
-
class Student(): count1 = 0 @staticmethod def static_method(x,y): Student.count1 += 1 print(Student.count1)
-
成员的可见性
- 对于类中变量的操作都应该通过方法来实现。
- 通过在变量或方法名称前面加上"__"双下划线来将变量或方法私有。
- 不要自作多情在前后都加双下划线,类似于"__function_var__"。
-
class Student(): __sum1 = 0 # __sum1为类私有,类外访问不到 def __init__(self): pass
class Student(): # 动态语言特性 def __init__(self): # 将__score私有 __score = 0 stu1 = Student() stu1.__score = -1 print(stu1.__score) #(此处并不会报错, # 什么?我们既可以对"__score"赋值还可以访问,"Excuse me???") #(注意:此'__score'非彼'__score') #(由于Python动态语言的特性,通过'stu1.__score = -1'操作实际上是stu1对象新增了__score对象,所 # 以我们才访问得到) stu2 = Student() print(stu2.__score) #(报错啦!!!) #(stu2对象并没有新增__score属性)
-
(没有什么绝对私有???)
class Student():
def __init__(self, name):
__score = 0
self.name = name
stu1 = Student("Alice")
#(通过__dict__属性来查看stu1对象下的变量)
print(stu1.__dict__)
# {
# "name":"Alice",
# "_Student__score":0,
# }
#(可以看到Python实现私有的方式是该变量名称。(下划线+类名+双下划线的私有变量名))
#(所以我们仍可以在类外通过"_Student__score"来访问更改私有变量,)
面向对象三大特性(继承,封装,多态)之继承
class Human():
def __init__(self, name, age):
self.name = name
self.age = age
class Student(Human):
def __init__(self, school, name, age):
self.school = school
# 类加实例方法,这种调用很奇怪,逻辑上讲不通,但Python并不会报错,
# Human.__init__(self, name, age)
super(Student, self).__init__(name, age)
# print(school + name + str(age))
stu1 = Student("一中", "Alice", 18)