0x01 代码实例
#!/usr/bin/env python 3.7
# -*- coding: utf-8 -*-
# @Time : 2018/9/29 20:44
# @Author : wkend
# @File : demo1.py
# @Software: PyCharm
# 定义一个类,object表示People所继承的类,若People没有自定义要继承的类,统一用object,
# object表示所有类都会继承的类
class People(object):
# 定义类属性name
name_People = ''
# 定义私有属性weight,以两个__来表示
__weight = 0
# 定义构造方法,__init__方法的第一个参数永远是self,表示创建的实例本身
def __init__(self, name, age, __weight, weight_People):
# 在构造方法中给类属性name赋值
People.name_People = name
# 定义实例属性age
self.age_self = age
# 在构造方法中给私有属性__weight赋值,这里用self来调用
self.__weight = __weight
# 在构造方法中给私有属性__weight赋值,这里用类名来调用
People.__weight = weight_People
# 普通类方法,必须通过外部实例调用,不能用类名调用
def speak__ordinary(self):
# 引用类属性
print('(类属性)name: ' + People.name_People) # 通过类名引用
print('(类属性)name: ' + self.name_People) # 通过实例self引用
# 引用实例属性
print('(实例属性)age: ' + str(self.age_self))
# print('(实例属性)age' + str(People.age_self)) # 错误引用方式
# 引用私有属性
print('(私有属性)wight: ' + str(self.__weight)) # 通过实例self访问
print('(私有属性)wight: ' + str(People.__weight)) # 通过类名来访问
# 定义一个类方法,用关键字@classmethod来申明,第一个参数必须为类本身,一般用cls表示
# 不能访问实例属性
# 通过类名和实例对象调用
@classmethod
def speak_class(cls):
# 访问类属性
print('(类属性)name: ' + People.name_People) # 通过类名引用
# print('(类属性)name: ' + self.name_People) # 错误,不能通过实例self引用
print('(类属性)name: ' + cls.name_People) # 通过类本身来引用
# 访问私有属性
# print('(私有属性)wight: ' + str(self.__weight)) # 通过实例self访问
print('(私有属性)wight: ' + str(People.__weight)) # 通过类名来访问
print('(私有属性)wight: ' + str(cls.__weight)) # 过类本身来引用
# 定义静态方法,与类相关,但是不依赖类与实例,
# 不能访问类属性,参数不能传入self,即不能引用实例属性
# 通过类名和实例对象调用
@staticmethod
def speak_static():
# 引用类属性
print('(类属性)name: ' + People.name_People) # 通过类名引用
#print('(类属性)name: ' + self.name_People) # 不能通过实例self引用
# 引用私有属性
# print('(私有属性)wight: ' + str(self.__weight)) # 不能通过实例self访问
print('(私有属性)wight: ' + str(People.__weight)) # 过类本身来引用
# 如果类中已经定义了__init__构造方法,则不能用这种形式实例化得到类对象
# p = People()
p = People('Tom', 30, 55, 66) # 创建一个实例对象
# 调用普通类方法
print('/**********调用普通类方法*************/')
p.speak__ordinary() # 通过实例对象来调用普通类方法
# People.speak__ordinary() #错误,不能用类名来调用普通类方法
# 调用类方法
print('/**********调用类方法*************/')
People.speak_class() #通过类名调用类方法
p.speak_class() # 通过实例调用类方法
# 调用静态方法
print('/**********调用静态方法*************/')
People.speak_static() #通过类名调用静态方法
p.speak_static() # 通过实例调用静态方法